node.js - Mongoose 多重深度填充

标签 node.js mongodb mongoose mongoose-populate

比如说,我有 Manager 模式:

{
    name: { type: String },
    clients: [{ type: Mongoose.Schema.ObjectId, ref: 'Client'}]
}

而且,我有 Client 模式:

{
    name  : { type String },
    cars  : [{ type: Mongoose.Schema.ObjectId, ref: 'Car' }],
    houses: [{ type: Mongoose.Schema.ObjectId, ref: 'House' }]
}

还有 CarHouse(它们的结构对于这个问题并不重要。我如何深入填充多个 Client 的字段在单个 .populate() 调用中?

我尝试了什么:

Manager.find()
    .populate({
         path: 'users',
         populate: { path: 'cars' },
         populate: { path: 'houses' }
    });

如果它有效(因为我覆盖了之前声明的传递给 .populate() 方法的 populate 键),我真的会感到惊讶。我的示例显然为每个用​​户返回填充的 houses 字段 - 最后一个。老实说,不知道,docs 什么都没有任何一个。它甚至受支持吗?根据我的例子,我知道这是为了“浅”填充:

User.populate('cars')
    .populate('houses')

那么深的呢?

最佳答案

1) 传递具有要填充的属性的对象数组:

Manager.find()
    .populate({
         path    : 'users',
         populate: [
             { path: 'cars' },
             { path: 'houses' }
         ]
    });

此解决方案可以充分利用深度填充。考虑:

Manager.find()
    .populate({
         path    : 'users',
         populate: [
             { path: 'cars' },
             { 
                path    : 'houses',
                populate: {
                    path    : 'rooms',
                    populate: 'windows'
                }
             }
         ]
    });

2) 传递要填充的以空格分隔的集合字符串:

Manager.find()
    .populate({
         path    : 'users',
         populate: 'cars houses'
    });

关于node.js - Mongoose 多重深度填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46001213/

相关文章:

javascript - NPM 无法识别我的模块(需要未知模块)

node.js - 是否可以将 mongoDB 中的二进制图像数据存储渲染到 Handlebars 模板?

node.js - nodemon 应用程序在尝试请求 mongoose 时崩溃

javascript - 如何在 Mongoose.js 中检查更新前/更新后 Hook 中的修改字段

angularjs - Node Express - 身份验证 token 的存储和检索

javascript - 为什么我在一条路线上没有得到 req.body ? Node JS

node.js - 未捕获的断言错误 : expected 404 to equal 405

arrays - MongoDB 从不在其他集合中的集合中获取文档

javascript - Meteor:如何获取 useraccounts 包将新的用户文档写入远程集合​​?

javascript - 嵌套 for 循环功能