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

MongoDB 从变长嵌套数组动态生成键值对的实现方法

MongoDB聚合动态生成嵌套对象字段实现方案

核心实现逻辑

  • 单独使用$map只能返回数组结构,无法直接生成键值对对象,需要搭配$arrayToObject操作符做格式转换
  • 动态键名不需要硬编码,通过字符串分割从category.coding.code字段自动提取:将code值按/分割后取最后一段,即可得到paid_amt、discount_amt这类目标键名
  • 逐层遍历外层item数组、内层adjudication数组做转换即可,不限制adjudication的元素数量

可直接复用的聚合管道代码

db.your_collection.aggregate([
  {
    $addFields: {
      item: {
        $map: {
          input: "$item",
          as: "singleItem",
          in: {
            $mergeObjects: [
              "$$singleItem",
              {
                adjudication: {
                  $arrayToObject: {
                    $map: {
                      input: "$$singleItem.adjudication",
                      as: "singleAdj",
                      in: {
                        // 提取斜杠后的字符串作为动态键
                        k: {
                          $last: {
                            $split: [
                              { $first: "$$singleAdj.category.coding.code" },
                              "/"
                            ]
                          }
                        },
                        // 取金额值作为键对应的值
                        v: "$$singleAdj.amount.value"
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

输出效果

转换后adjudication字段结构完全匹配预期:

{
  "adjudication": {
    "paid_amt": 22.51,
    "discount_amt": 0
  }
}

适配调整说明

  • 如果coding数组存在多个元素,可以先用$filter筛选出system等于bb.org/adjudication的元素再取code值,避免取错键
  • 该逻辑自动适配所有同格式的code取值,不需要提前枚举所有可能的键名
  • 如果不需要保留item下的其他原有字段,可以去掉$mergeObjects部分,直接返回转换后的adjudication字段即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:39:23