如何在MongoDB查询中利用聚合管道将数组转换为对象?
解决MongoDB聚合管道中数组转配对对象数组的问题
嘿,刚上手MongoDB的话,聚合管道的操作符确实得慢慢熟悉,不过你这个把两个数组按位置配对成对象数组的需求,用$zip + $map就能轻松搞定,我给你一步步拆解下:
完整聚合管道示例
直接上可运行的代码,你可以直接套用到你的集合上:
db.your_collection_name.aggregate([ { $project: { // 可选:如果不需要保留原文档的_id,加上这行 _id: 0, fields: { $map: { // 先用$zip把两个数组按位置配对成二维数组 input: { $zip: { inputs: ["$field1", "$field2"], useLongestLength: true } }, // 给每个配对后的子数组起个临时别名 as: "pair", // 把每个子数组转换成目标对象格式 in: { field1: { $arrayElemAt: ["$$pair", 0] }, field2: { $arrayElemAt: ["$$pair", 1] } } } } } } ])
关键操作符解释
$zip:核心作用是把多个输入数组按索引位置一一配对,比如你的field1和field2会被转换成[[1,'a'], [2,'b'], ..., [5,'e']]。useLongestLength: true是个实用参数,如果两个数组长度不一致,会自动给短的数组补null来适配长数组的长度;如果你的两个数组长度肯定完全相同,也可以省略这个参数。$map:用来遍历$zip生成的二维数组,把每个子数组映射成你需要的对象结构。as: "pair"定义了遍历过程中每个子数组的临时变量名,$arrayElemAt则用来取出子数组中对应位置的元素,赋值给新对象的field1和field2。
测试效果
假设你的原始文档是:
{ field1: [1,2,3,4,5], field2: ['a','b','c','d','e'] }
运行上述聚合管道后,输出结果就是你想要的格式:
{ "fields": [ { "field1": 1, "field2": "a" }, { "field1": 2, "field2": "b" }, { "field1": 3, "field2": "c" }, { "field1": 4, "field2": "d" }, { "field1": 5, "field2": "e" } ] }
内容的提问来源于stack exchange,提问作者Selva
相关产品推荐
相关产品推荐

