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的方法,然后在一个查询中“填充”它们,然后将结果注入原始结果。更新了我的答案,以解决您对填充和查找性能问题的担忧。根据数据的结构以及您尝试执行的操作,填充或查找可能不是最佳路径。