Многочисленные глубокие популяции мангустов

Скажем, у меня есть схема 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' }]
}

А также Car и House (их структура не важна для этого вопроса. Как мне глубоко заполнить несколько полей Client в одном вызове .populate()?

Что я пробовал:

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

и меня бы очень удивило, если бы это сработало (поскольку я перезаписываю ранее объявленный ключ populate, переданный методу .populate()). Мой пример, очевидно, возвращает заполненное поле houses для каждого пользователя — последнее. Честно говоря, понятия не имею, ничего нет и в документах. Он вообще поддерживается? Я знаю, что это для "мелкого" заполнения, основываясь на моем примере:

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

А что насчет глубокого?


person wscourge    schedule 01.09.2017    source источник
comment
Наверняка это просто Users.populate({ path: 'users', populate: { path: 'cars houses' } }). Быть 'cars houses' как разделенный пробелами список путей на текущем уровне. По крайней мере, это верно для одного уровня, поэтому то же самое должно быть и для всего остального.   -  person Neil Lunn    schedule 01.09.2017
comment
Спасибо, это помогает. Я пропустил объяснение этого в документах?   -  person wscourge    schedule 01.09.2017
comment
Список, разделенный пробелами, упоминается где-то в начале документации. Он заменяет .populate().populate(), о котором вы упомянули.   -  person Neil Lunn    schedule 01.09.2017
comment
Хорошо, спасибо. Рассмотрите возможность публикации вашего полезного комментария в качестве ответа, это может помочь кому-то еще.   -  person wscourge    schedule 01.09.2017


Ответы (1)


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'
    });
person wscourge    schedule 03.10.2017