我正在从一个架构如下的集合中查询大量文档:
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分组在一起,对它们进行分组查找,然后将结果添加回原始match
结果中。我不确定如何执行此操作,即使那是正确的方法也是如此。关于如何优化此查询的任何想法?提前谢谢!
答案 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