MongoDB: Проектирование встроенных полей в объекте с помощью ключа Dynami c - PullRequest
0 голосов
/ 09 апреля 2020

Как часть агрегации, которую я делаю, я получаю структуру данных в следующем формате -

{
  "name": "ABCD",
  "data": {
    "id1": {"data1": 123, "data2": 234, "data3": 345, "data4": 456},
    "id2": {"data1": 321, "data2": 432, "data3": 543, "data4": 654},
    "id3": {"data1": 111, "data2": 222, "data3": 333, "data4": 444},
    "id4": {"data1": 555, "data2": 666, "data3": 777, "data4": 888},
  }
}

Точно такие же поля данных (данные1, данные2 ....) будет присутствовать во всех полях идентификаторов (id1, id2 ...)

На моем последнем шаге агрегирования - я хотел бы проецировать только несколько полей внутри данных, таких как data2 и data3 как показано ниже -

{
  "name": "ABCD",
  "data": {
    "id1": {"data2": 234, "data3": 345},
    "id2": {"data2": 432, "data3": 543},
    "id3": {"data2": 222, "data3": 333},
    "id4": {"data2": 666, "data3": 777},
  }
}

Каким может быть мой шаг проекции для этого?

1 Ответ

0 голосов
/ 09 апреля 2020

Попробуйте добавить ниже стадии:

db.collection.aggregate([
  {
    $addFields: { /** Re-create 'data' field */
      "data": {
        $arrayToObject: { /** Convert new 'data' array to object */
          $map: {
            input: {
              $objectToArray: "$data" /** Convert 'data' object to array for iteration */
            },
            in: {
              k: "$$this.k",
              v: {
                data2: "$$this.v.data2",
                data3: "$$this.v.data3"
              }
            }
          }
        }
      }
    }
  }
])

Тест: MongoDB-Playground

Ссылка: агрегатных-операторы

...