Mongodb массив преобразования данных объекта - PullRequest
0 голосов
/ 29 января 2020

Это мой единственный документ из коллекции. Я хочу преобразовать данные этого формата в

{ 
    "_id" : ObjectId("5e311e8bb94999f1be0d5ead"), 
    "dealer_code" : "123", 
    "mappinginfo" : [
        {
            "territory" : "MORADABAD", 
            "area" : "UPH", 
            "zone" : "N"
        }
    ], 
    "active" : NumberInt(1), 
}

как эти данные

{ 
    "_id" : ObjectId("5e311e8bb94999f1be0d5ead"), 
    "dealer_code" : "123", 
    "territory" : "MORADABAD", 
    "area" : "UPH", 
    "zone" : "N"
    "active" : NumberInt(1), 
}

Ответы [ 3 ]

3 голосов
/ 29 января 2020

Вот запрос.

db.collection.aggregate([
  {
    $unwind: "$mappinginfo"
  },
  {
    $project: {
      _id: 1,
      active: 1,
      dealer_code: 1,
      territory: "$mappinginfo.territory",
      area: "$mappinginfo.area",
      zone: "$mappinginfo.zone",

    }
  },

])
2 голосов
/ 29 января 2020
db.collection.aggregate([
    { $unwind: "$mappinginfo" },
    {
        $project:
        {
            _id: 1,
            dealer_code: 1,
            active: 1,
            territory: "$mappinginfo.territory",
            area: "$mappinginfo.area",
            zone: "$mappinginfo.zone"
        }
    },
    { $out: "existing_collection_name" }
])
1 голос
/ 29 января 2020

Использовать конвейер агрегации .

Решение -

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 - $ проект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...