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

如何在MongoDB中分组数据并合并字段?文档转换需求求助

嘿,我来帮你搞定这个MongoDB聚合的问题!你想要的效果是按name和dept分组,然后把每个分组里的Code字段作为新键,对应的count作为值合并到结果里对吧?我帮你写了一个精准的聚合管道,完全能实现你的需求,咱们一步步来看:

首先,这是完整的聚合查询代码:

db.collection.aggregate([
  // 提取name、dept,把Code和count转成键值对格式
  {
    $project: {
      name: "$_id.name",
      dept: "$_id.dept",
      codeCount: { k: "$_id.Code", v: { $toString: "$_id.count" } }
    }
  },
  // 按name+dept分组,收集所有Code-count键值对
  {
    $group: {
      _id: { name: "$name", dept: "$dept" },
      codePairs: { $push: "$codeCount" }
    }
  },
  // 将键值对数组转成对象,合并到分组信息中
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$_id",
          { $arrayToObject: "$codePairs" }
        ]
      }
    }
  },
  // 把结果包装到_id字段中,匹配你的输出格式
  {
    $project: {
      _id: "$$ROOT"
    }
  }
])

接下来拆解每个阶段的作用:

  • $project阶段:我们从原始文档的_id对象里拆分出name和dept,同时把Code作为键名(k),count转成字符串作为值(v),生成codeCount这个键值对结构——这一步是为后续的动态键转换做准备。
  • $group阶段:核心的分组操作,按name和dept的组合进行分组,把每个分组内的所有codeCount都收集到codePairs数组里。这一步之后,每个分组会得到类似{ _id: {name: "User1", dept: "A"}, codePairs: [{k: "Code1", v: "4"}, {k: "Code2", v: "4"}] }的中间结果。
  • $replaceRoot阶段:用$arrayToObject把codePairs数组转换成一个对象(比如{Code1: "4", Code2: "4"}),再通过$mergeObjects把这个对象和分组的name、dept合并成一个完整的对象,作为新的根文档。
  • 最后一个$project阶段:把合并后的完整对象包装到_id字段里,完全贴合你想要的输出格式。

小提示:如果你的count不需要转成字符串形式,可以去掉$toString,直接用"$_id.count"作为v的值就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:27:32