#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 ] } }
]
}
}
}
}
}
])