【问题标题】:MongoDB sort is slow for non-index dynamic field对于非索引动态字段,MongoDB 排序很慢
【发布时间】:2018-01-11 15:14:58
【问题描述】:

以下是我的 MongoDB 查询,用于显示组织列表以及每个组织的用户数。根据我的数据模型,“用户”集合有一个数组 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 本身需要更多时间。

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

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

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

    【讨论】:

    • 有一个 $match 阶段来过滤拥有 750 个用户的内部组织。即使使用 $match 查询也很慢。
    • 您的意思是我们需要在 noOfUsers 上创建索引吗?请解释
    • 显示整个聚合。通常,索引应以匹配阶段中的所有字段开头,紧随其后的是排序字段。我会给你命令试试看。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 2018-11-25
      • 2019-07-12
      • 2019-10-19
      • 2019-02-23
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 2016-07-10
      相关资源
      最近更新 更多