假设我在 MongoDB 集合中有几百万个文档,如下所示:
[
{
"timestamp": "2024-01-01T00:00:00Z",
"schema": "1.0.0",
"value": 3,
},
{
"timestamp": "2024-01-01T01:00:00Z",
"schema": "1.2.0",
"value": -10,
},
...
]
现在,我想使用聚合管道执行以下操作:
value
的绝对最大值(保留原始符号),并添加原始文档的 timestamp
和 schema
。因此,所需的输出类似于:
[
// January bucket
{
"bucket": "2024-01-01T00:00:00Z",
"value": {
"timestamp": "2024-01-01T01:00:00Z",
"schema": "1.2.0",
"absMax": -10
}
}
]
显然,默认的
$max
累加器不起作用,因为它有两个问题:
timestamp
和schema
,只输出数值因此,我尝试了两种不同的方法来解决这个问题:
$group
阶段,我使用 $push
将所有原始文档推送到 $raw
文档中,然后使用 $reduce
进行查看。我需要 $raw
文档才能始终提供 timestamp
和 schema
。$group
阶段,我使用自定义累加器函数(参见https://www.mongodb.com/docs/manual/reference/operator/aggregation/accumulator/)来减少每个文档并保留原始 timestamp
和 schema
位于其状态的绝对最大值旁边。现在,我遇到以下问题:
我用 MongoDB Playgrounds 更新了我的问题:
$push
):https://mongoplayground.net/p/01e5Oa58VfV为了完整起见,仅使用
$min
和 $max
,但丢失 timestamp
和 schema
:https://mongoplayground.net/p/UegNExWo2np
在大数据集上,解决方案 2 的速度大约是解决方案 1 的两倍。
我是否忽略了什么?
首先,您可以使用 $dateTrunc
更轻松地进行分组其次,你不必推
$$ROOT
,使用
{
data: { $push: {timestamp: "$timestamp", schema: "$schema"}},
max: {$max: "$value"}
}
剩下的只是一些装饰。稍后可以提供完整的解决方案。