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

基于最大值的MongoDB任意键值对复杂合并需求

MongoDB 动态字段取最大值合并文档

需求概述

需要将集合中的多个文档合并为单个文档,每个字段保留其在所有文档中的最大值(数字取最大数值,字符串按UTF-8字典序取最大),且字段数量不固定,无法针对特定字段硬编码处理。

解决方案(聚合管道)

使用MongoDB聚合框架,通过动态转换文档格式实现任意字段的最大值提取:

db.collection.aggregate([
  // 将每个文档转换为键值对数组格式
  { $project: { data: { $objectToArray: "$$ROOT" } } },
  // 展开键值对数组,使每个字段成为独立文档
  { $unwind: "$data" },
  // 按字段名分组,计算每个字段的最大值
  { $group: { _id: "$data.k", maxVal: { $max: "$data.v" } } },
  // 将所有字段的聚合结果重新组合为键值对数组
  { $group: { _id: null, fields: { $push: { k: "$_id", v: "$maxVal" } } } },
  // 将键值对数组转回文档格式,作为最终结果
  { $replaceRoot: { newRoot: { $arrayToObject: "$fields" } } }
])

逻辑说明

  1. $project + $objectToArray:把每个文档的键值对转换成{k: 字段名, v: 字段值}的数组,实现动态字段的统一处理。
  2. $unwind:将数组展开,让每个字段单独成为一条文档,方便后续分组计算。
  3. $group(第一次):按字段名分组,用$max聚合操作提取该字段的最大值。
  4. $group(第二次):将所有字段的最大值结果重新聚合成一个键值对数组。
  5. $replaceRoot + $arrayToObject:把键值对数组转换回标准文档格式,得到最终合并结果。

示例结果说明

针对你提供的示例输入,按上述逻辑处理后:

  • one.two.three字段的最大值为10(符合期望)
  • number.two字段的字符串比较中,MongoDB的$max会取UTF-8字典序更大的"B",而非示例中的"A"。如果需求是取字符串的最小值,只需将聚合阶段中的$max替换为$min即可得到"A"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:03:31