对于非索引动态字段

时间:2018-01-11 15:14:59

标签: mongodb mongodb-query aggregation-framework

以下是我的MongoDB查询,用于显示组织列表以及每个组织的用户数。根据我的数据模型,“users”集合有一个数组userOrgMap,用于维护用户所属的组织(通过orgId)。 “组织”集合不会在其集合中存储已分配用户的列表。 “用户”集合有11,200个文档,“组织”有10,500个文档。

db.organizations.aggregate([
{$lookup : {from:"users",localField:"_id", foreignField:"userOrgMap.orgId",as:"user" }},
{ $project : {_id:1,name:1,"noOfUsers":{$size:"$user"}}},
{$sort:{noOfUsers:-1},
{$limit : 15},
{$skip : 0}
]);

没有排序,查询工作得很快。通过排序,查询的工作速度非常慢。大约需要200秒。

我甚至尝试了另一种方式,也花了更多的时间。

db.organizations.aggregate([
    {$lookup : {from:"users",localField:"_id", foreignField:"userOrgMap.orgId",as:"user" }},
    {$unwind:"$user"}
    {$group :{_id:"$_id"},name:{"$firstName":"$name"},userCount:{$sum:1}},
    {$sort:{noOfUsers:-1},
    {$limit : 15},
    {$skip : 0}
    ]);

对于上面的查询,没有$ sort本身需要更多时间。

需要有关如何解决此问题的帮助。

2 个答案:

答案 0 :(得分:0)

获取聚合以使用以noOfUsers开头的索引,因为我在这里看不到$ match阶段。

答案 1 :(得分:0)

问题得到解决。我在“userOrgMap.orgId”上创建了一个索引。查询现在很快。