Node.js и Mongoose, не могу восстановить _id - PullRequest
1 голос
/ 03 августа 2011

Я пытаюсь сохранить документ в своей коллекции и, если сохранение прошло успешно, вернуть _id этого же документа.Проблема в том, что я получаю неопределенное значение для моего _id в обоих случаях, либо созданную модель из мангуста, либо из обратного вызова.По сути, мой единственный способ получить _id - это найти документ по одному из его свойств, а затем получить значение.Этот подход не то, что я хочу, зная, что я сейчас пытаюсь сделать, должно работать.

1 Ответ

2 голосов
/ 03 августа 2011

вам не нужно указывать _id в вашей схеме, она будет сгенерирована автоматически.и если вы хотите, чтобы имя было уникальным, вы также можете настроить это в схеме.если members предполагается, что это "реальный" пользовательский _ids, тогда попробуйте что-то вроде [ObjectId].

var TrophySchema = new Schema({
  name: {type:String, required:true, unique:true},
  accessCode: String,
  description: String,
  //reference to User ID
  members: [ObjectId],
  comments: [Comment]
});

, и я не знаю, работает ли это

var trophy = new Trophy({...data...});

какВы сделали это, я всегда делаю это так:

var trophy = new Trophy();
trophy.name = "my name";
// ...

и _id должны быть установлены, как только вы создаете объект (http://stackoverflow.com/questions/6074245/node-mongoose-get-last-inserted-id).

, поэтому просто сделайте это так:

trophy.save(function (err) {
  if (err) {
    if (err.toString().indexOf('duplicate key error index') !== -1) {
      // check for duplicate name error ...
    }
    else {
      // other errors
    }
    res.send('Error in trophy saving:' + err);
  }
  else {
    User.findOne({_id:post.id}, function(err2, user) {
      if (err2) {/* ... */}
      else if (user) {
        user.trophyLink = trophy._id;
        res.send(user);
      }
    }
  }
});

важно то, что сохранение не возвращает трофей, который вы должны использовать тот, который вы создали сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...