MongoDB聚合投影:将同索引data2.value合并至data数组
实现MongoDB数组按索引合并字段的方案
当然可以实现你想要的效果!因为数组长度不固定,硬编码索引肯定行不通,我们可以用MongoDB的聚合操作符来动态完成对应索引字段的合并。
具体聚合管道实现
这里会用到$zip和$map两个数组操作符,配合$mergeObjects来合并对象,直接看代码:
db.items.aggregate([ { $project: { data: { $map: { input: { $zip: { inputs: ["$data", "$data2"] } }, as: "pair", in: { $mergeObjects: ["$$pair.0", "$$pair.1"] } } }, data2: 0 // 排除不需要的data2字段 } } ])
代码分步解释
$zip配对数组元素:$zip: { inputs: ["$data", "$data2"] }会把两个数组按索引位置一一配对,生成一个嵌套数组,比如你的示例数据会变成:[[{"name": "First"}, {"value": 20}], [{"name": "Second"}, {"value": 30}]]$map遍历配对元素:遍历每一组配对后的元素,把每一组命名为pair。$mergeObjects合并对象:$mergeObjects: ["$$pair.0", "$$pair.1"]会把每组里的第一个对象(来自data)和第二个对象(来自data2)合并成一个新对象,也就是把对应索引的value字段添加到data的文档里。
版本兼容性说明
$mergeObjects是MongoDB 3.6及以上版本支持的操作符,$zip从MongoDB 3.2开始就支持了,所以只要你的MongoDB版本在3.6以上,这个方案就能正常运行。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

