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

MongoDB聚合中如何将文档内两个数组合并为键值对对象

MongoDB合并等长数组为键值对对象

针对你的需求,这里有两种实用的聚合管道写法,能帮你把questions和answers两个等长数组转成键值对形式的result对象:

方法一:使用$zip配对数组(推荐,更高效)

$zip可以直接把两个数组对应位置的元素配对成子数组,非常适合等长数组的场景:

db.cases.aggregate([
  {
    $project: {
      case_number: 1, // 保留原始的case_number字段
      result: {
        // 把处理后的数组转成键值对对象
        $arrayToObject: {
          // 遍历每一对问题-答案组合
          $map: {
            input: { $zip: { inputs: ["$questions", "$answers"] } },
            as: "pair",
            in: {
              k: { $arrayElemAt: ["$$pair", 0] }, // 取配对子数组的第一个元素作为键
              v: { $arrayElemAt: ["$$pair", 1] }  // 取配对子数组的第二个元素作为值
            }
          }
        }
      },
      _id: 0 // 不需要保留默认的_id字段可以加上这行
    }
  }
])

方法二:通过索引匹配元素

如果你的MongoDB版本不支持$zip(不过这个操作符在3.2+就已支持),可以用$indexOfArray获取元素索引,再从另一个数组中取值:

db.cases.aggregate([
  {
    $project: {
      case_number: 1,
      result: {
        $arrayToObject: {
          $map: {
            input: "$questions",
            as: "question",
            in: {
              k: "$$question",
              v: {
                // 获取当前问题在questions数组中的索引,再从answers数组取对应值
                $arrayElemAt: ["$answers", { $indexOfArray: ["$questions", "$$question"] }]
              }
            }
          }
        }
      },
      _id: 0
    }
  }
])

两种方法执行后,都会得到你期望的结果:

{ "case_number" : "123", "result" : { "Primary Organ Site": "Uterus", "Date of Diagnosis": "12/12/2017" } }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:44:09