MongoDB聚合计数太慢

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":"

我收集了大约6万份
用户
文档,并有以下查询:

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
属性建立索引。