MongoDB聚合计数太慢
我收集了大约6万份MongoDB聚合计数太慢,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我收集了大约6万份用户文档,并有以下查询: db.getCollection('users').aggregate([ {"$match":{"userType":"employer"}}, {"$lookup":{"from":"companies","localField":"_id","foreignField":"owner.id","as":"company"}}, {"$unwind":"$company"}, {"$lookup":{"from":"
用户
文档,并有以下查询:
db.getCollection('users').aggregate([
{"$match":{"userType":"employer"}},
{"$lookup":{"from":"companies","localField":"_id","foreignField":"owner.id","as":"company"}},
{"$unwind":"$company"},
{"$lookup":{"from":"companytypes","localField":"company.type.id","foreignField":"_id","as":"companyType"}},
{"$unwind":"$companyType"},
{ $group: { _id: null, count: { $sum: 1 } } }
])
计数大约需要12秒,甚至我在list函数之前调用了count函数,但我的list函数的限制:10
响应速度比count快
下面是解释结果:
{
"stages" : [
{
"$cursor" : {
"query" : {
"userType" : "employer"
},
"fields" : {
"company" : 1,
"_id" : 1
},
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "jobs.users",
"indexFilterSet" : false,
"parsedQuery" : {
"userType" : {
"$eq" : "employer"
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"userType" : {
"$eq" : "employer"
}
},
"direction" : "forward"
},
"rejectedPlans" : []
}
}
},
{
"$lookup" : {
"from" : "companies",
"as" : "company",
"localField" : "_id",
"foreignField" : "owner.id",
"unwinding" : {
"preserveNullAndEmptyArrays" : false
}
}
},
{
"$match" : {
"$nor" : [
{
"company" : {
"$eq" : []
}
}
]
}
},
{
"$group" : {
"_id" : {
"$const" : null
},
"total" : {
"$sum" : {
"$const" : 1
}
}
}
},
{
"$project" : {
"_id" : false,
"total" : true
}
}
],
"ok" : 1.0
}
$lookup
操作很慢,因为它们从以下位置模拟左连接行为:
$lookup在localField上执行与
从集合的文档中删除foreignField
因此,如果用于加入的字段中没有索引,则collections Mongodb将强制执行集合扫描
为foreignField
属性添加索引应可防止集合扫描,并提高性能,即使是在很大程度上查询未使用任何索引,您是否尝试索引公司名称
?@Paizo我已使用全文搜索为用户
和公司
集合编制了索引OK,但是您的解释说明指定不使用索引“indexFilterSet”:false,
;无论如何,我认为,$lookup
是一个致命的部分,从用户
和公司
集合和预期输出中发布一个示例文档。@jones如果您使用$lookup
请确保为foreignField
属性建立索引。