我有一个包含大约10.2M records.My聚合查询的集合,大约需要6s才能发送回一个record.How,我优化了聚合查询吗?索引在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看起来this.It也包含其他组合
if (last === 'H') {
idObj = {
day: { $dayOfYear: '$transactionDate' },
hour: {
$subtract: [
{ $hour: '$transactionDate' },
{ $mod: [{ $hour: '$transactionDate' }, parseInt(exceptLast)] },
],
},
};}
发布于 2022-01-05 13:43:24
我将提到一些我认为可以提高性能的更改,但是总的来说,我会说这是非常优化的,我个人不会花更多的时间来优化它,除非它是许多进程的一个不可分割的部分,并且运行时的每毫秒都很重要。
token0Address和token1Address字段创建复合索引,目前Mongo正在使用这些索引,但是它需要基于timestamp获取和匹配文档。如果可以将这两个索引构建为复合{token0Address: 1, timestamp: 1},那么Mongo可以更快地完成$match阶段。(显然取决于给定的范围和匹配文档的规模).如果可能的话,
idObj,您提到了idObj有不同的结构,可能有些结构的冗余可以消除,在这里,由于$mod操作符的动态使用,我们不能真正做任何事情,另一种可能是预处理所需的字段(例如,在本例中保存$hour结果,因此我们停止使用这个操作)。,
。
https://stackoverflow.com/questions/70592798
复制相似问题