如何在MongoDB中加速agregate查询

如何在MongoDB中加速agregate查询,mongodb,performance,aggregate,Mongodb,Performance,Aggregate,我运行的聚合查询示例与此类似: 我创建的一个集合有5000000个插入的大JSON文档(大约1000个K->V对,有些是嵌套的) 在对一个嵌套字段添加索引之前,对该字段进行计数大约需要5分钟。 在为计数添加索引后,只需不到一秒钟的时间(这很好) 现在,我正在尝试做SUM或AVG或上面任何类似的例子-它需要几分钟(而不是几秒钟)。 有没有办法改进MongoDB中的聚合查询 谢谢 不幸的是,该组目前没有在mongodb中使用索引。只有排序和匹配可以利用索引。因此,您编写的查询是尽可能优化的 你可以

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

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

在对一个嵌套字段添加索引之前,对该字段进行计数大约需要5分钟。 在为计数添加索引后,只需不到一秒钟的时间(这很好)

现在,我正在尝试做SUM或AVG或上面任何类似的例子-它需要几分钟(而不是几秒钟)。 有没有办法改进MongoDB中的聚合查询


谢谢

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

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

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


一般来说,mongo速度非常快。在我看来,唯一不如SQL的地方就是聚合。对我来说,好处远远大于困难。我通常按照我的建议为这种情况维护单独的报告集合。

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

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

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


一般来说,mongo速度非常快。在我看来,唯一不如SQL的地方就是聚合。对我来说,好处远远大于困难。我通常按照我的建议为这种情况维护单独的报告集合。

。当你在做你能做的事情时,你有最佳的“查询”选择,处理大量数据的纯粹过程需要相当长的时间。远远超过查询计划员评估有多少结果与索引匹配所需的时间(尤其是当这些结果都在内存中时)。好的。。我在MySQL(sum)上对任何列运行类似的查询,在5M记录上只需不到几秒钟。。我知道在MySQL中很难实现嵌套JSON(或者至少没有那么快),但在这种情况下,我希望Mongo具有更好的性能。。或者可能还有其他一些调整?(我从客户那里得到随机的JSON,因此我无法控制它在出现之前的外观,但需要存储和索引几个字段)…根据您的数据的静态程度,您可能可以每X运行一次此查询,并将结果插入到文档中。”请理解,在MySQL中嵌套JSON并不容易(或者至少没有那么快)“--所以它实际上根本不是一个“类似的查询”,是吗?也许你真的应该尝试一些类似的东西,即“平面”中的值被索引的属性。老实说,这个问题太广泛了。提高性能可能有很多原因和很多不同的方法,从重新设计到放大或缩小。如果您所做的只是基准测试一个操作(已经不完全相同)针对不同的数据库,它也太宽泛了。我如何重新设计JSON,我无法控制它,它可以是任意数量的字段、任意数量的嵌套字段和任意结构?任何新的JSON都是不同的。我得到的只是JSON和应该索引哪些字段的路径(嵌套时)。此外-开始向外扩展或向上扩展的规则是什么?对于运行MongoDB进行聚合查询的一台现代机器(例如8 CPU,64GB),5M记录是否太多?原始数据大小约为6GB。当您在做您能做的事情时,您有最佳的“查询”选择,处理大量数据的纯粹过程需要相当长的时间。远远超过查询计划者评估有多少结果与索引匹配所需的时间(特别是当这些结果都在内存中时)。好的。我正在MySQL上运行类似的查询(sum)对于任何列,在5M记录上花费的时间都不到几秒钟。我知道在MySQL中很难实现嵌套JSON(或者至少没有那么快),但在这种情况下,我们希望Mongo具有更好的性能。或者可能还有其他一些调整?(我从客户那里得到随机的JSON,因此我无法控制它在出现之前的外观,但需要存储和索引几个字段)…根据您的数据的静态程度,您可能可以每X运行一次此查询,并将结果插入到文档中。”请理解,在MySQL中嵌套JSON并不容易(或者至少没有那么快)“--所以它根本不是一个真正的“相似查询”,是吗?也许你实际上应该尝试一些相似的东西,即索引的“平面”属性中的值。老实说,问题远不止这些
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"
      }
    }
  }
]);