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

MongoDB中如何用$objectToArray递归展开嵌套KV映射(已知层数)

MongoDB 递归展开指定层数的嵌套KV映射为键值集合

单聚合阶段实现(推荐)

针对指定N层嵌套映射的展开需求,可在单个$set阶段中,通过嵌套$map与$objectToArray结合类型判断实现,无需硬编码未知键名:

处理2层嵌套的示例代码

db.collection.aggregate([
  {
    $set: {
      nestedMap: {
        $map: {
          input: { $objectToArray: "$nestedMap" },
          as: "level1",
          in: {
            k: "$$level1.k",
            v: {
              $cond: {
                if: { $isObject: "$$level1.v" },
                then: { $objectToArray: "$$level1.v" },
                else: "$$level1.v"
              }
            }
          }
        }
      }
    }
  }
])

扩展到N层嵌套

若需处理3层及以上,只需在$cond的then分支中继续嵌套相同逻辑。例如处理3层嵌套时:

db.collection.aggregate([
  {
    $set: {
      nestedMap: {
        $map: {
          input: { $objectToArray: "$nestedMap" },
          as: "level1",
          in: {
            k: "$$level1.k",
            v: {
              $cond: {
                if: { $isObject: "$$level1.v" },
                then: {
                  $map: {
                    input: { $objectToArray: "$$level1.v" },
                    as: "level2",
                    in: {
                      k: "$$level2.k",
                      v: {
                        $cond: {
                          if: { $isObject: "$$level2.v" },
                          then: { $objectToArray: "$$level2.v" },
                          else: "$$level2.v"
                        }
                      }
                    }
                  }
                },
                else: "$$level1.v"
              }
            }
          }
        }
      }
    }
  }
])

多阶段实现(备选)

若嵌套层数较多导致单阶段代码冗长,可拆分多个$set阶段逐层处理,每一层将当前对象转换为{k,v}数组:

db.collection.aggregate([
  // 处理第一层
  { $set: { nestedMap: { $objectToArray: "$nestedMap" } } },
  // 处理第二层
  {
    $set: {
      nestedMap: {
        $map: {
          input: "$nestedMap",
          as: "item",
          in: {
            k: "$$item.k",
            v: { $cond: [{ $isObject: "$$item.v" }, { $objectToArray: "$$item.v" }, "$$item.v"] }
          }
        }
      }
    }
  },
  // 如需处理第三层,继续添加类似阶段
])

输入输出示例

输入

{
  "nestedMap": {
    "1001": {
      "0": "A",
      "1": "B",
      "2": "C",
      "3": "D"
    },
    "1002": {
      "0": "A",
      "1": "B",
      "2": "C",
      "3": "D"
    }
  }
}

输出

{
  "nestedMap": [
    {
      "k": "1001",
      "v": [
        { "k": "0", "v": "A" },
        { "k": "1", "v": "B" },
        { "k": "2", "v": "C" },
        { "k": "3", "v": "D" }
      ]
    },
    {
      "k": "1002",
      "v": [
        { "k": "0", "v": "A" },
        { "k": "1", "v": "B" },
        { "k": "2", "v": "C" },
        { "k": "3", "v": "D" }
      ]
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:37:21