Mongoose 深度填充多个 2 级对象不起作用

Posted

技术标签:

【中文标题】Mongoose 深度填充多个 2 级对象不起作用【英文标题】:Mongoose deep populating multiple 2nd level objects not working 【发布时间】:2016-06-27 16:37:55 【问题描述】:

我有一个模型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 by 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() 函数上声明的最后一个 path populate,在这种情况下仅填充模型 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 ...
        ]
    
]

【问题讨论】:

【参考方案1】:

我不知道为什么它甚至接受了对象中的多个populate 键,它已经重复了, 您指定填充的是:

 populate: 
            path: 'b',
            model: B
        ,
        populate: 
            path: 'c',
            model: C
        ,

这里属性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);
    )

【讨论】:

天哪!谢谢纳伊姆!我没注意到。 为我节省了一些时间!! mongoosejs.com/docs/populate.html#deep-populate 非常感谢人!我在那个用例上苦苦挣扎。我仍然认为我们可能会避免使用 mongoose,而是使用原生 nodejs mongodb 驱动程序。

以上是关于Mongoose 深度填充多个 2 级对象不起作用的主要内容,如果未能解决你的问题,请参考以下文章

NestJS + Mongoose + GraphQL:“填充”不起作用

mongoose - 从 3 级深度数组中添加和删除对象

在填充中排序不起作用(猫鼬)

跨多个级别填充不起作用

猫鼬填充不起作用

如何在 mongoosejs 中深度填充多个路径?