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
相关产品推荐
相关产品推荐

