如何对结果具有相似查找值的查询执行多个$ lookup?

时间:2019-08-02 21:30:20

标签: mongodb mongoose

我正在从一个架构如下的集合中查询大量文档:

let mySchema = mongoose.Schema({
title: {
    type: String
},
user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
},
company: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Company'
},
....
});

上述架构中的许多文档的usercompany都将具有相似的值,我正在尝试找到执行此查询的最有效方法。这是我所拥有的,但是我觉得它的表现不如预期:

this.model('MyModel')
    .aggregate([
        {$match: match_stuff_here},
        $lookup: {
            from: "users",
            localField: "user",
            foreignField: "_id",
            as: "user"
        }
        $lookup: {
            from: "companies",
            localField: "company",
            foreignField: "_id",
            as: "company"
        }
        {$project: {
            _id: 1,
            title: 1,
            "user._id": 1,
            "user.name": 1,
            "company._id": 1,
            "company.name": 1
        }}
    ])
    .exec(function (err, data) {
        ...
    });

似乎我应该以某种方式将所有常见用户ID和公司ID分组在一起,对它们进行分组查找,然后将结果添加回原始match结果中。我不确定如何执行此操作,即使那是正确的方法也是如此。关于如何优化此查询的任何想法?提前谢谢!

1 个答案:

答案 0 :(得分:1)

由于已经使用ObjectId和ref对其进行了设置,因此可以使用.populate使生活更轻松https://mongoosejs.com/docs/populate.html

对于您而言,这应该适合您:

var results = await Model.find(matchQuery).populate('user').populate('company');
console.log(results);

更新

假设您要从“用户”和“公司”这两个集合中提取数据,则没有单个查询可以检索所有需要的数据。您将需要至少3次致电-匹配查询,获取用户数据,获取公司数据。据我了解,它将映射需要填充的内容,然后查询数据。您可以在源https://github.com/Automattic/mongoose/blob/4.3.7/lib/model.js#L2456

中查看该功能

您还可以通过启用调试来查看猫鼬在填充过程中使用的查询

mongoose.set('debug', true);

这个人很好地解释了http://frontendcollisionblog.com/mongodb/2016/01/24/mongoose-populate.html