猫鼬多个深居人口

wsc*_*rge 5 mongoose mongodb node.js mongoose-populate

说,我有Manager架构:

{
    name: { type: String },
    clients: [{ type: Mongoose.Schema.ObjectId, ref: 'Client'}]
}
Run Code Online (Sandbox Code Playgroud)

而且,我有Client架构:

{
    name  : { type String },
    cars  : [{ type: Mongoose.Schema.ObjectId, ref: 'Car' }],
    houses: [{ type: Mongoose.Schema.ObjectId, ref: 'House' }]
}
Run Code Online (Sandbox Code Playgroud)

而且CarHouse(它们的结构对此并不重要。如何Client在单个.populate()调用中深度填充多个字段?

我尝试了什么:

Manager.find()
    .populate({
         path: 'users',
         populate: { path: 'cars' },
         populate: { path: 'houses' }
    });
Run Code Online (Sandbox Code Playgroud)

如果它奏效的话,这会让我真正感到惊讶(因为我覆盖了之前声明的populate传递给.populate()方法的键)。我的示例显然返回了houses每个用户的填充字段-最后一个。老实说,不知道,文档中也没有。甚至支持吗?根据我的示例,我知道它是针对“浅”填充的:

User.populate('cars')
    .populate('houses')
Run Code Online (Sandbox Code Playgroud)

那深渊呢?

wsc*_*rge 8

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

Manager.find()
    .populate({
         path    : 'users',
         populate: [
             { path: 'cars' },
             { path: 'houses' }
         ]
    });
Run Code Online (Sandbox Code Playgroud)

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

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

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

Manager.find()
    .populate({
         path    : 'users',
         populate: 'cars houses'
    });
Run Code Online (Sandbox Code Playgroud)