Node.js和Mongoose,不能恢复_id

我试图将文档保存在我的集合中,如果保存成功,则返回同一文档的_id。 问题是我得到了一个未定义的值我的_id在这两种情况下,从mongoose创build的模型或从callback返回。 基本上,我得到_id的唯一方法就是通过其中一个属性search文档,然后获取值。 这种方法是不是我想要的,知道我目前正在尝试做什么应该工作。

var createTrophy = new Trophy({ name : post.name, accessCode : post.password, description : post.description, members : [id] }); Trophy.findOne({name:post.name}, function(err, trophy) { if(err){ console.log('Mongoose: Error: ' + err); res.send('Error db query -> ' + err); } else if(trophy){ console.log('Trophy ' + trophy.name + ' already existant'); res.send('Trophy ' + trophy.name + ' already existant'); }else{ createTrophy.save(function(err, doc){ var uid = createTrophy._id; if (err) { console.log('Error in trophy saving:' + err); res.send('Error in trophy saving:' + err); }else{ User.findOne({_id:post.id}, function(err, user) { if(err){ console.log('Mongoose: Error: ' + err); res.send('Error db query -> ' + err); } else if(user){ console.log(doc._id + ' ' + uid); user.trophyLink = doc._id; res.send(user); //user.save(function(err){ // if(err){res.send('Couldnt update trophy of profile');} //}); } else{ console.log('User id Inexistant'); res.send('User id Inexistant'); } }); } }); } }); }); 

图式

  var Trophy = new Schema({ _id : ObjectId, name : String, accessCode : String, description : String, //reference to User ID members : [Number], comments :[Comment] }); 

你不需要在Schema中提供_id ,它会自动生成。 如果你希望这个名字是唯一的,你也可以在Schema中进行configuration。 如果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应该在创build对象时立即设置(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); } } } }); 

重要的是,保存不会返回你必须使用自己创build的奖杯。