猫鼬多重深度填充

Mongoose multiple deep populates

说,我有 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(它们的结构对于这个问题并不重要。我如何在单个[=19=中深度填充多个Client的字段]打电话?

我尝试了什么:

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

如果它有效(因为我覆盖了之前声明的传递给 .populate() 方法的 populate 键,我真的会感到惊讶)。我的示例显然 returns 每个用户填充 houses 字段 - 最后一个。老实说,不知道,docs 中也没有。它甚至受支持吗?根据我的示例,我知道它用于 'shallow' 填充:

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) 传递要填充的 space 分隔集合的字符串:

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

这是做嵌套填充的方法。在这种情况下,首先它将填充用户,然后填充用户的爱好,然后根据用户的爱好填充足球,然后它会从用户填充最喜欢的球员姓名 -> 爱好 -> 足球 -> 最喜欢的球员。

Model.find()
    .populate({
         path    : 'users',
         populate: [
             { path: 'Hobbies' },
             { 
                path    : 'Football',
                populate: {
                    path    : 'favouritePlayers',
                    populate: 'playerNames'
                }
             }
         ]
    });