Использовать конвейер агрегации .
Решение -
db.test.aggregate([
{ $unwind: "$mappinginfo" },
{ $project: {
dealer_code: 1,
territory: "$mappinginfo.territory",
area: "$mappinginfo.area",
zone: "$mappinginfo.zone",
active: 1
}}
]);
Объяснение
Конвейер агрегации, как его имя, работает с данными в трубопровод. Конвейер имеет вход, оператор и выход. Для приведенного выше примера -
- Первый этап - это этап раскручивания, который будет заполнен всей коллекцией. Оператор размотки будет выполнять итерации для отдельных документов и для каждого документа будет создавать столько же копий, сколько элементов в поле mappinginfo . Для вашего случая он создаст только одну копию. После этапа раскрутки результирующий документ будет выглядеть следующим образом -
[{
"_id" : ObjectId("5e311e8bb94999f1be0d5ead"),
"dealer_code" : "123",
"mappinginfo": {
"territory" : "MORADABAD",
"area" : "UPH",
"zone" : "N"
}
"active" : NumberInt(1),
}]
Обратите внимание, что mappinginfo больше не является списком.
- Следующий этап - этап проецирования. Оператор $ project просто примет приведенный выше список документов в качестве входных данных и для каждого документа либо просто спроецирует поле как есть, либо изменит значение поля на основе того, что доступно в текущем документе.
{ "active": 1 }
подразумевает проекцию значения как есть. { "zone": "$mappinginfo.zone" }
подразумевает проецирование значения зоны в поле mappinginfo под именем зоны на уровне root.
Дополнительная информация об обоих операторах - - $ unwind - $ проект