Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何执行多个$lookup';在结果具有相似查找值的查询上的?_Mongodb_Mongoose - Fatal编程技术网

Mongodb 如何执行多个$lookup';在结果具有相似查找值的查询上的?

Mongodb 如何执行多个$lookup';在结果具有相似查找值的查询上的?,mongodb,mongoose,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' }, .... }); 上述模式中的许多

我正在对其架构如下所示的集合中的大量文档执行查询:

let mySchema = mongoose.Schema({
title: {
    type: String
},
user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
},
company: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Company'
},
....
});
上述模式中的许多文档对于
user
company
都具有类似的值,我正在尝试找到执行此查询的最有效方法。这是我所拥有的,但我觉得它没有表现得那么好:

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组合在一起,作为一个组对它们进行查找,然后将结果添加回原始的
匹配结果中。我不知道如何做到这一点,甚至不知道这是否是正确的方法。关于如何优化这个查询有什么想法吗?提前谢谢

因为您已经用ObjectId和ref设置了它,所以您可以使用.populate来简化操作

在您的情况下,这应该适用于您:

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

假设您希望从两个集合中提取数据——“用户”和“公司”,则没有一个查询将检索所需的所有数据。您将需要至少3个调用-匹配查询、获取用户数据、获取公司数据。据我所知,它将映射需要填充的内容,然后查询数据。您可以在源代码中查看该函数

您还可以通过启用调试来查看mongoose在填充期间使用的查询

mongoose.set('debug', true);

这家伙很好地解释了这一点

在某些情况下,$lookup对我们的工作更有用。另外,据我所知,填充和查找都将遍历match语句之后返回的每个文档,并一次“填充”它们中的每一个。我要寻找的是一种获取所有类似用户ID和公司ID的方法,然后在一个查询中“填充”它们,然后将结果注入原始结果。更新了我的答案,以解决您对填充和查找性能问题的担忧。根据数据的结构以及您尝试执行的操作,填充或查找可能不是最佳路径。