MongoDB分组求绝对值最大值:$push+$reduce与自定义累加器的疑问
MongoDB聚合:按天分组并获取绝对值最大的value及关联字段
文档结构
我的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字段。
已尝试的解决方案
我尝试了两种方案,但都存在不足:
- $push+$reduce方案:在
$group阶段用$push将所有原始文档存入$raw字段,再通过$reduce处理。但该方案会将数百万文档推入内存,超出MongoDB聚合步骤100MB的内存上限,引发内存问题。 - 自定义累加器方案:在
$group阶段使用自定义累加器函数,逐步筛选出符合要求的文档并保留相关字段。该方案在大数据集上的速度约为方案1的两倍,但代码不够简洁,且MongoDB不推荐使用JavaScript编写的自定义累加器。
疑问
- 是否遗漏了更优的解决方案?
$push+$reduce是否真的比自定义累加器慢?
内容的提问来源于stack exchange,提问作者user9817468211
相关产品推荐
相关产品推荐

