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

MongoDB聚合:如何将数组字段转为最大值对应元素?

解决MongoDB聚合中提取数组最大分值元素(禁用$unwind/$group)的问题

需求明确

现有输入文档结构:

{
   name: "use_name",
   grades: [
     {class: "math", grade: 100},
     {class: "english", grade: 90}
   ]
}

需要输出grades字段为数组中grade值最大的元素,且禁止使用$unwind或$group阶段(避免触发100MB内存限制),同时保证执行效率。

解决方案:使用$reduce单文档数组处理

直接用$project阶段配合$reduce操作符,在单文档内遍历grades数组,实时保留分值最高的元素,无需展开数组或跨文档聚合,完全符合性能和限制要求。

完整聚合管道代码:

db.collection.aggregate([
  {
    $project: {
      name: 1,
      grades: {
        $reduce: {
          input: "$grades",
          initialValue: { grade: -Infinity }, // 初始值设为极小值,确保第一个元素能被选中
          in: {
            $cond: [
              { $gt: ["$$this.grade", "$$value.grade"] },
              "$$this", // 当前元素分值更高,替换累加器
              "$$value" // 保留原有最高分元素
            ]
          }
        }
      }
    }
  }
])

代码说明

  • $reduce是MongoDB的数组迭代操作符,仅在当前文档内处理数组,不会产生跨文档的内存占用,完全规避$unwind/$group带来的100MB限制风险。
  • 初始值设为{ grade: -Infinity },确保数组中第一个元素必然会替换初始值,同时兼容空数组或全负分值的异常场景。
  • 每次迭代仅比较当前元素与累加器的grade值,保留较大的那个,时间复杂度为O(n)(n为数组长度),执行效率极高。

输出结果

执行上述管道后,将得到预期的结果:

{
   name: "use_name",
   grades: {class: "math", grade: 100}
}

内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:05:39