обновить массив объектов с помощью массива в агрегации mongodb

#mongodb #aggregation-framework

#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:

$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