Mongoose无法将ref -Schema.Types.ObjectId设置为其他文档

我试图根据文档保存与mongoose的文档http://mongoosejs.com/docs/populate.html首先,我调用parent.save和parent.save的callback内我使用child.save。 但是,当我检查parent.childs我可以看到,没有孩子已被添加。 父模式是Home:

var HomeSchema = new Schema({ password : String, draft : { type: Boolean, default: true }, edited : { type: Boolean, default: false }, guests : [{type : Schema.Types.ObjectId, ref : 'Guest'}], _event : {type : Schema.Types.ObjectId, ref : 'Event'} }); 

子模式是Guest:

 var GuestSchema = new Schema({ _home : {type : Schema.Types.ObjectId, ref : 'Home'}, firstname : String, lastname : String, coming : { type: String, default: 'dnk-coming' }, phone : String, email : String, address : String, edited : { type: Boolean, default: false }, draft : { type: Boolean, default: true } }); 

为了避免任何误解,您必须知道这两个Schema包含在我的用户架构中:

 var userSchema = mongoose.Schema({ homes:[homeSchema.HomeSchema], events:[eventSchema.EventSchema], guests:[eventSchema.guestSchema], }); 

现在您应该拥有所有必需的信息来完整理解执行过程:

  UserModel.findById(user._id, function(err, userFound) { if (!err) { /* cleaning draft*/ userFound.homes = that.clean(userFound.homes); /* setting draft */ var HomeModel = mongoose.model("Home"); var homeModel = new HomeModel(); homeModel.draft = true; if (userFound.homes === null) { userFound.homes = []; } homeModel.save(function(err) { if (!err) { var GuestModel = mongoose.model("Guest"); var guestModel = new GuestModel(); guestModel._home = homeModel._id; guestModel.save(function(err) { if (!err) { // @ma08 : According to the doc this line should'nt be required //homeModel.guests.push(guestModel._id); so when I use this obviously the id is correctly set but when I try a populate after saving the populate do not work userFound.homes.push(homeModel); userFound.guests.push(guestModel); userFound.save(function(err) { if (!err) { successCallback(); } else { errorCallback(); } }); } }); } }); 

这种处理不会导致任何错误。 但是,当我将获得的user.guestsstring化时,它不能正常工作:

 guests: [ { coming: 'dnk-coming', edited: false, draft: true, _id: 53dcda201fc247c736d87a95, _home: 53dce0f42d5c1a013da0ca71, __v: 0 }] 

这是绝对罚款我得到_home id等…然后我stringify user.homes,我得到:

  homes: [ { draft: true, edited: false, guests: [], _id: 53dce0f42d5c1a013da0ca71, __v: 0 } ] 

根据文件的客人应该设置,但它不是< – 这是我的问题。 请帮我弄清楚我做错了什么。 我可以把它设置为manualy,但根据文档,我不认为这样工作。

 guestModel.save(function(err) {... 

这是错误的,因为你正在将用户embedded到userSchema 。 因此,跳过guestModel.save ,只需在guestModelpushguestModel userFound

embedded式文档无法引用。 如果没有获得父文件,你不能指向它。 所以你不能同时embedded和保留embedded文档。 您应该selectembedded或添加参考。

我的build议是devise你的模式。 将guests分开存放。 将ref存储在userhome模式中。 如果你想存储一些关系数据,你可以像[{guestId:{type:Schema.Types.ObjectId,ref:'Guest'},field1:{type:...},field2:{...}..] ,如果你只是想要ref [{type:Schema.Types.ObjectId,ref:'Guest'}]