使用mongodb聚合中的数组更新对象数组

时间:2020-10-06 19:33:30

标签: mongodb aggregation-framework

在聚合时,我遇到以下情况:在某些时候,我的文档在根级别包含一组对象和一个相同长度的数组。一个例子是:

{_id:0,
 cars:[{name:"vw polo",door:3},{name:"vw golf",door:5}],
 possible_colors:[["black","blue"],["white"]]}

我现在要尝试的是将可能的颜色更新投影到cars数组的每个对象中。预期结果应如下所示。

{_id:0,
 cars:[{name:"vw polo",door:3,possible_colors:["black","blue"]},
       {name:"vw golf",door:5,possible_colors:["white"]}],
 }

我已经尝试过{$addfields:{cars:{$zip:[$cars,$possible_colors]}}},但是这会创建一个数组列表,其中每个数组都包含对象和正确的子数组,但是我无法合并它们。

1 个答案:

答案 0 :(得分:2)

$zip运算符是一种很好的方法,但是您需要与$map一起使用其他$mergeObjects才能获得所需的结构:

db.collection.aggregate([
    {
        $addFields: {
            cars: {
                $map: {
                    input: { $zip: { inputs: [ "$cars", "$possible_colors" ] } },
                    in: {
                        $mergeObjects: [
                            { $arrayElemAt: [ "$$this", 0 ] },
                            { possible_colors: { $arrayElemAt: [ "$$this", 1 ] } }
                        ]
                    }
                }
            }
        }
    }
])

Mongo Playground