具有多个子路径的猫鼬填充路径

Posted

技术标签:

【中文标题】具有多个子路径的猫鼬填充路径【英文标题】:Mongoose populating path with multiple subpaths 【发布时间】:2016-06-27 18:20:10 【问题描述】:

假设我有以下模型:

# MODEL A
schemaA = mongoose.Schema
    _bId:
        type: mongoose.Schema.Types.ObjectId
        ref: "B"

# MODEL B
schemaB = mongoose.Schema
    _cId:
        type: mongoose.Schema.Types.ObjectId
        ref: "C"
    _dId:
        type: mongoose.Schema.Types.ObjectId
        ref: "D"

# MODEL C
schemaC = mongoose.Schema
    _eId:
        type: mongoose.Schema.Types.ObjectId
        ref: "E"

模型 D 和 E 没有任何其他对象引用,因此为方便起见不再列出。

用所有引用填充模型“A”的最佳做法是什么? 目前我解决这个任务如下(这是一个实例方法,因为我经常需要它):

schemaA.methods =
    populateAll: (cb) ->
       @
        .populate
            path:  "_bId"
            model: "B"
            populate:
                path: "_cId"
                model: "C"
                populate:
                    path: "_eId"
                    model: "E"
        , (error) =>
            return cb error, @ if error?
            D.findById @._bId._dId
            .exec (error, d) =>
                return cb error, @ if error?

                @._bId._dId = d
                return cb error, @

这是我发现填充所有引用的唯一方法,因为在不同模型中使用多个路径填充多个路径非常困难。我已经尝试过类似下面的解决方案,但可以想象,它只会覆盖以前的人口:

 @
 .populate
     path:  "_bId"
     model: "B"
     populate:
         path: "_cId"
         model: "C"
         populate:
             path: "_eId"
             model: "E"
 .populate
     path:  "_bId"
     model: "B"
     populate:
         path: "_dId"
         model: "D"

【问题讨论】:

【参考方案1】:
   @
    .populate
        path:  "_bId"
        model: "B"
        populate: [
            
                path: "_cId"
                model: "C"
                populate:
                    path: "_eId"
                    model: "E"
            
            
                path: "_dId"
            
        ]
    , (error) =>

这个解决方案工作得很好,我刚刚发现了这一点。

【讨论】:

以上是关于具有多个子路径的猫鼬填充路径的主要内容,如果未能解决你的问题,请参考以下文章

嵌套的猫鼬填充了承诺

如何填充新创建的猫鼬文档?

使用 Q 的猫鼬嵌套填充不起作用

尽管路径被填充,猫鼬填充()返回未定义

如何使用外键数组在没有 _id 的猫鼬中填充?

如何使用猫鼬“填充”来指定不同集合的现有文档的路径?