深度填充Mongoose多个二级对象不起作用
我有一个模型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 }
基于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); })
– 它应该返回填充的第二级别,但它的确存在问题,它只populate
在.populate({})
函数上声明的最后一个path
,在这种情况下,只有模型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 ... ] } ]
我期待着这样的事情:
[ { "foo":"Bar", "b": [ { "c":{ "foo1":"Bar1", "foo2":"Bar2", "foo3":"Bar3" }, "d":{ "foo1":"Bar1", "foo2":"Bar2", "foo3":"Bar3" } }, { "c":{ "foo1":"Bar1", "foo2":"Bar2", "foo3":"Bar3" }, "d":{ "foo1":"Bar1", "foo2":"Bar2", "foo3":"Bar3" } } // so on ... ] } ]
我不知道为什么它甚至接受对象中的多个populate
键,它已经被复制,你指定填充的是:
populate: { path: 'b', model: B }, populate: { path: 'c', model: C },
这里属性populate
得到重复,只有最后一个定义被考虑。
您需要将一次填充path指定为一个数组。 所以你的填充属性会变成:
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); })