Сколько запросов к базе данных выполняется при использовании populate? - PullRequest
0 голосов
/ 28 февраля 2019

Имеют следующий сценарий -

   const Person = mongoose.model('Person', {
        name: String
    });
    const FamilyTree = mongoose.model('FamilyTree', {
        person: { type: Schema.Types.ObjectId, ref: 'Person' },
        children: [FamilyTree]
    });


    const run = async => {
        await Promise.all(['Bob', 'Mike', 'Rory'].map( name => Person.create({name}) ));

        let bob = await Person.find({name: 'Bob'}); // [request to BD] total requests = 1
        let mike = await Person.find({name: 'Mike'}); // [request to BD] total requests = 2
        let rory = await Person.find({name: 'Rory'}); // [request to BD] total requests = 3

        await FamilyTree.create({
            person: bob._id,
            children: [
                {
                    person: mike._id,
                    children: [
                        {
                            person: rory._id,
                            children: []
                        }
                    ]
                }
            ]
        });

        await FamilyTree.find().populate('person').exec(); // how many db requests will there be? 1 or 3?
    }

Сколько запросов к базе данных выполняется при использовании заполнения, при условии, что ответ содержит следующие данные?

Данные, извлеченные из базы данных -

{
    person: {name: 'Bob'},
    children: [{person: 'Mike', children: [{name: 'Rory', children: []}]}]
}

1 Ответ

0 голосов
/ 28 февраля 2019

Отличный вопрос, мне тоже было любопытно.потом я нашел это.

Mongoose делает некоторые хитрые вещи за кулисами.Если вы посмотрите на фактический запрос, сделанный в результате этого заполненного запроса, он будет выглядеть примерно так

FamilyTree.find({});
person.find({ _id: { $in: ['5678', '9012', '3456'] } });

Так что это просто $in запрос!Mongoose собирает все поля _id, которые нужно искать для каждой коллекции, а затем после этого ... Я не совсем уверен.Глядя на исходный код, кажется, что он делает некоторые умные вещи, чтобы отразить результаты этого запроса и отобразить правильные объекты обратно в каждый исходный документ, основываясь на его положении в заполненном графике, который вы передали в запрос ... или что-то в этом роде.вот так (вы можете просмотреть исходный код, начиная со строки 2468 в lib / model.js , если вы так склонны).

Ссылка: http://frontendcollisionblog.com/mongodb/2016/01/24/mongoose-populate.html

...