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

MongoDB聚合框架实现数组元素扁平化与字段重命名

用MongoDB聚合一步完成数组扁平化

没问题,我来帮你搞定这个需求!不用Python或者VBA后续处理,直接用MongoDB的聚合框架就能一步把Stat数组里的统计项平铺到根文档里,而且不管有50+还是更多统计项都能自动处理,完全不用手动逐个定义字段。

先给你直接能用的完整聚合代码,之后再一步步解释每个部分的作用:

db.yourCollection.aggregate([
  // 第一步:把Stat数组转成键值对对象
  {
    $addFields: {
      statKV: {
        $arrayToObject: {
          $map: {
            input: "$Stat",
            as: "item",
            in: {
              k: "$$item.@attributes.name", // 用统计项的name作为键
              v: "$$item.@value"            // 用统计项的value作为值
            }
          }
        }
      }
    }
  },
  // 第二步:把键值对对象合并到根文档
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [ "$$ROOT", "$statKV" ]
      }
    }
  },
  // 第三步:移除不需要的临时字段和原Stat数组
  {
    $project: {
      Stat: 0,
      statKV: 0
    }
  }
])

逐个阶段解释(完全零基础友好):

  • $addFields阶段:我们先创建一个临时字段statKV,这里做了两件事:
    1. 用$map遍历你的Stat数组,把每个数组元素转换成{k: 名称, v: 值}的格式(比如第一个元素会变成{k: "A", v:7})。
    2. 再用$arrayToObject把这个转换后的数组直接变成一个键值对对象,也就是{"A":7, "B":3, "C":14,...}。
  • $replaceRoot阶段:用$mergeObjects把原来的整个文档($$ROOT代表当前整个文档)和刚才生成的statKV对象合并,这样原来的company_id、year等字段,加上新的A、B等统计字段就全部变成根级别的字段了。
  • $project阶段:最后把没用的原Stat数组和临时的statKV字段移除,得到你想要的最终结构。

额外小提示:

如果你的Stat数组可能存在为空或者缺失的情况,可以在$map的input里加个$ifNull做容错处理,避免报错:

input: { $ifNull: [ "$Stat", [] ] },

只需要把代码里的yourCollection换成你实际的集合名称,直接运行就能得到目标结果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:29:47