MongoDB - разбить массив на несколько документов и заменить существующий do c объектами массива - PullRequest
2 голосов
/ 24 марта 2020

У меня есть один большой json документ в коллекции, например:

{
  "_id": {
    "$oid": "5e7a50e7f1d41b3ea05aa46e"
  },
  "response": {
    "count": 2,
    "items": [
      {
        "id": 1,
        "first_name": "Unknown",
        "last_name": "Unknown",
        "is_closed": false,
        "can_access_closed": true,
        "photo": "1.jpg",
        "track_code": "d9e2ca2eG4GbHAQSwz8Ne4WBiVx"
      },
      {
        "id": 2,
        "first_name": "Lorem",
        "last_name": "Ipsum",
        "is_closed": false,
        "can_access_closed": true,
        "photo": "2.jpg",
        "track_code": "23f1219a7j1xyWba69jz7p"
      }
    ]
  }
}

Как я могу разделить "элементы" по отдельным объектам (например, по идентификатору в элементах) в коллекции? В результате я хочу получить что-то вроде:

Объект # 1

{
  "_id": {
    "$oid": "5e7a50e7f1d41b3ea05aa46e"
  },
  "id": 1,
  "first_name": "Unknown",
  "last_name": "Unknown",
  "is_closed": false,
  "can_access_closed": true,
  "photo": "1.jpg",
  "track_code": "d9e2ca2eG4GbHAQSwz8Ne4WBiVx"
}

Объект # 2

{
  "_id": {
    "$oid": "ae2a40e7ffd41b3ea05aa46e"
  },
  "id": 2,
  "first_name": "Lorem",
  "last_name": "Ipsum",
  "is_closed": false,
  "can_access_closed": true,
  "photo": "2.jpg",
  "track_code": "23f1219a7j1xyWba69jz7p"
}

Я не могу понять, как искать это в документации.

1 Ответ

1 голос
/ 25 марта 2020

Вы можете попробовать запрос ниже, с этим ваш результат может иметь больше документов, чем фактическое число в коллекции, поскольку мы взрываем элементы массив:

db.collection.aggregate([
  /** Adds '_id' field to each object inside items array, this can be done after 'unwind',
   *  if it's done after 'unwind' no.of docs to be iterated in 'unwind' is more, So better be done as first stage*/
  {
    $addFields: {
      "response.items._id": "$_id"
    }
  },
  /** Unwind items array, will exclude docs where items is not an array/doesn't exists */
  {
    $unwind: "$response.items"
  },
  /** Replace 'response.items' object as new root(document) */
  {
    $replaceRoot: {
      newRoot: "$response.items"
    }
  }
])

Тест: MongoDB-Playground

Ссылка: агрегационный конвейер

...