我在这个字段中有一个模型A
:
var field = {
foo: String,
b: [{ type: Schema.Types.ObjectId, ref: 'B' }]
}
和模型B
与这个领域:
var field = {
c: { type: Schema.Types.ObjectId, ref: 'C' } // let's say this has 3 string field
d: { type: Schema.Types.ObjectId, ref: 'D' } // so was this
}
基于answer Trinh Hoang Nhu这样做 -
A.find({_id:req.params.id})
.populate({ path: 'patient', model: Patient,
populate: {
path: 'b',
model: B
},
populate: {
path: 'c',
model: C
},
})
.exec(function (err, doc) {
res.send(doc);
})
-it应该返回已填充的第二级,但它确实存在,但问题是populate
函数上声明的最后path
只有.populate({})
,在这种情况下只有模型{{ 1}}已填充。但是当您使用模型C
更改其位置时,将填充模型B
。
上面的查询返回如下内容:
B
我期待这样的事情:
[
{
"foo":"Bar",
"b": [
{
"c":"a32s1da4fas1a23s1da56s4c",
"d":{
"foo1":"Bar1",
"foo2":"Bar2",
"foo3":"Bar3"
}
},
{
"c":"a32s1da4fas1a23s1da56s4d",
"d":{
"foo1":"Bar1",
"foo2":"Bar2",
"foo3":"Bar3"
}
}
// so on ...
]
}
]
答案 0 :(得分:8)
我不知道为什么它甚至接受了对象中的多个populate
键,它已经被复制了,
你指定填充的是:
populate: {
path: 'b',
model: B
},
populate: {
path: 'c',
model: C
},
这里属性populate
被复制,只考虑最后定义的属性。
您需要将填充路径指定为一个数组。所以你的populate属性将成为:
populate: [{
path: 'b',
model: B
},{
path: 'c',
model: C
}]
查询是,
A.find({_id:req.params.id})
.populate({ path: 'patient', model: Patient,
populate: [{
path: 'b',
model: B
},{
path: 'c',
model: C
}],
})
.exec(function (err, doc) {
res.send(doc);
})