【问题标题】:How to optimize the mongodb aggregate query如何优化mongodb聚合查询
【发布时间】:2022-01-05 12:22:27
【问题描述】:

我有一个包含大约 1020 万条记录的集合。我的聚合查询大约需要 6 秒才能发回一条记录。如何优化我的聚合查询。?索引在 token0address、token1address 和时间戳字段上定义。

以下是我的查询

  {
    $match: {
      $or: [
        {
          token0Address: quoteCurrency,
        },
        {
          token1Address: quoteCurrency,
        },
      ],
      timestamp: {
        $gte: Number(historyDTO.from),
        $lte: Number(historyDTO.to),
      },
    },
  },
  {
    $group: {
      _id: idObj,
      transactionDate: { $first: '$transactionDate' },
      timestamp: { $first: '$timestamp' },
      minimum_price: { $min: '$priceInToken0' },
      maximum_price: { $max: '$priceInToken0' },
      median_price: { $avg: '$priceInToken0' },
      open_price: { $first: '$priceInToken0' },
      close_price: { $last: '$priceInToken0' },
      volume: { $sum: '$priceInToken0' },
    },
  },
  { $sort: { timestamp: -1 } },
  { $skip: 0 },
  { $limit: Number(historyDTO.countback) },

idObj 长这样。它也包含其他组合

if (last === 'H') {
idObj = {
  day: { $dayOfYear: '$transactionDate' },
  hour: {
    $subtract: [
      { $hour: '$transactionDate' },
      { $mod: [{ $hour: '$transactionDate' }, parseInt(exceptLast)] },
    ],
  },
};

}

【问题讨论】:

标签: typescript mongodb mongoose aggregate nestjs


【解决方案1】:

我会提到一些我认为可以提高性能的更改,但总的来说,我会说这是非常优化的,我个人不会花更多时间优化它,除非它是许多进程的组成部分并且运行时的每一毫秒都是很重要。

  1. token0Addresstoken1Address 两个字段创建复合索引,现在Mongo 正在使用这些索引,但是它需要根据timestamp 获取和匹配文档。如果您可以将两个索引都构建为复合 {token0Address: 1, timestamp: 1},那么 Mongo 可以更快地完成 $match 阶段。 (显然取决于给定的范围和匹配文件的规模)。

  2. 如果可能的话,改变idObj,你提到idObj有不同的结构,也许其中一些有可以消除的冗余,由于$mod操作符的动态使用,这里我们真的不能做任何事情, 另一种可能性是预处理所需的字段(例如在本例中保存$hour 结果,因此我们停止使用此操作)。

  3. 最后一个选项更像是一种技巧,但如果您了解数据分布和查询的启发式方法,您可能能够添加更早的限制并处理更少的数据。这通常不是一个现实的选择,尤其是在您的数据规模较小的情况下。

【讨论】:

  • 我们对字段进行了一些更改,而不是在 token0address、token1address 和 timestamp 上实现索引,我们在 pair 字段和 timestamp 上应用索引并使其成为复合索引,另外我们使用了 allowDisk:true。响应时间从大约 6 秒变为 1 秒。
猜你喜欢
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2019-09-21
  • 2010-12-18
  • 2021-05-04
  • 2018-02-18
  • 2010-10-23
相关资源
最近更新 更多