使用填充时执行多少个数据库查询?

时间:2019-02-28 07:22:07

标签: mongoose mongoose-populate

具有以下情况-

   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 :(得分:1)

好问题,我也很好奇。然后我找到了。

猫鼬在后台做一些聪明的事情。如果您查看由于此填充查询而产生的实际查询,则其外观看起来像这样

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

因此,它只是一个$in查询!猫鼬会收集每个集合需要查找的所有_id字段,然后在此之后……我不太确定。查看源代码,看起来它确实做了一些聪明的工作来反映该查询的结果,并根据传递给查询的填充图中的位置将正确的对象映射回每个原始文档……这样(如果您愿意,可以查看lib / model.js 的 2468行附近的源代码)

参考:http://frontendcollisionblog.com/mongodb/2016/01/24/mongoose-populate.html