深度填充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); })