我试图根据文档http://mongoosejs.com/docs/populate.html使用猫鼬保存文档 首先我调用parent.save并在parent.save的回调中使用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 }
});
为避免任何误解,您必须知道我的用户架构中包含这两个架构:
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();
}
});
}
});
}
});
此处理不会导致任何错误。但是当我对用户进行字符串化时,它并没有按预期工作:我得到了:
guests:
[ { coming: 'dnk-coming',
edited: false,
draft: true,
_id: 53dcda201fc247c736d87a95,
_home: 53dce0f42d5c1a013da0ca71,
__v: 0 }]
绝对没问题我得到_home id等... 然后我将user.homes字符串化,然后我得到:
homes:
[ { draft: true,
edited: false,
guests: [],
_id: 53dce0f42d5c1a013da0ca71,
__v: 0 } ]
根据文件,客人应该被设置,但它不是< - 这是我的问题。请帮我弄清楚我做错了什么。我可以手动设置它,但根据文档,我认为不应该以这种方式工作。
答案 0 :(得分:3)
guestModel.save(function(err) {...
这是错误的,因为您将来宾嵌入userSchema
。
因此,请跳过guestModel.save
中的push
和guestModel
中的userFound
{/ 1}}
嵌入式文档永远不能引用。您无法在不获取父文档的情况下指向它。因此,您无法嵌入并保留对嵌入文档的引用。您应该在嵌入或添加引用之间进行选择。
我的建议是设计这样的模式。将guests
存储在单独的集合中。将引用存储在guest
和user
架构中的home
。如果您想存储一些关系数据,您可以像[{guestId:{type:Schema.Types.ObjectId,ref:'Guest'},field1:{type:...},field2:{...}..]
一样存储参考,如果您只想要参考[{type:Schema.Types.ObjectId,ref:'Guest'}]