You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段。

已尝试的解决方案

我尝试了两种方案,但都存在不足:

  1. $push+$reduce方案:在$group阶段用$push将所有原始文档存入$raw字段,再通过$reduce处理。但该方案会将数百万文档推入内存,超出MongoDB聚合步骤100MB的内存上限,引发内存问题。
  2. 自定义累加器方案:在$group阶段使用自定义累加器函数,逐步筛选出符合要求的文档并保留相关字段。该方案在大数据集上的速度约为方案1的两倍,但代码不够简洁,且MongoDB不推荐使用JavaScript编写的自定义累加器。

疑问

  1. 是否遗漏了更优的解决方案?
  2. $push+$reduce是否真的比自定义累加器慢?

内容的提问来源于stack exchange,提问作者user9817468211

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:22:04