如何在MongoDB中加快agregate查询的速度

时间:2017-09-21 21:40:10

标签: mongodb performance aggregate

我正在运行与此类似的聚合查询示例:

https://www.compose.com/articles/aggregations-in-mongodb-by-example/

db.mycollection.aggregate([
  { 
    { $match: {"nested.field": "1110"}}, {
    $group: {
      _id: null,
      total: {
        $sum: "$nested.field"
      },
      average_transaction_amount: {
        $avg: "$nested.field"
      },
      min_transaction_amount: {
        $min: "$nested.field"
      },
      max_transaction_amount: {
        $max: "$nested.field"
      }
    }
  }
]);

我创建的一个集合有5,000,000个插入的大JSON文档(大约1,000 K-> V对,有些是嵌套的)。

在一个嵌套字段上添加索引之前 - 需要大约5分钟才能完成该字段的计数。 添加索引后 - 计数只需不到一秒钟(这很好)。

现在我正在尝试使用SUM或AVG或上面的任何其他类似示例 - 它需要几分钟(而不是几秒)。 有没有办法改善MongoDB中的聚合查询?

谢谢!

1 个答案:

答案 0 :(得分:1)

不幸的是,group目前不使用mongodb中的索引。只有排序和匹配才能利用索引。因此,您编写的查询尽可能优化。

你可以做几件事。对于max和min,您可以只查询它们而不是使用聚合框架。您可以按$ nested.field进行排序,只需一个。您可以在$ nested.field上放置索引,然后可以使用相同的索引对升序或降序进行排序。

如果您可以控制数据的插入时间,并且查询非常简单,您可以自己跟踪数据。因此,您可以在mongo中有一个表,其中集合具有“Id”或您正在分组的任何内容,并且具有“total”和“sum”的字段。您可以在插入时增加它们,然后获得总数和平均值将是快速查询。不确定这是否适合您的情况,但是您可以做到最好。

一般来说,mongo超级快。在我看来,唯一不如SQL的地方就是聚合。这些好处远远超过了我的挣扎。根据我的建议,我通常会为这种情况保留单独的报告集。