Как вывести объект массива в корень документа в MongoDB с помощью агрегации?

У меня есть этот документ:

{"_id":"1", "elem":"ok",
   "arrayOfObjects":[
                     {"type":"k","fieldx":"lol"},
                     {"type":"SndObject","fieldy":"foo"},
                     {"type":"Object1","fieldx":"bob"}
                    ]
}

что такое агрегация, чтобы иметь этот вывод:

{"_id":"1", "elem":"ok",
"Object1":[
          {"type":"Object1","fieldx":"lol"},
          {"type":"Object1","fieldx":"bob"}
          ],
 "SndObject":[{"type":"SndObject","fieldy":"foo"}]
}

Я нашел выход, но мне нужно знать все, что у меня есть:

{ 
  "$addFields" : { 
    "Object1" : { 
      "$filter": { 
        "input": "$arrayOfObjects", 
        "as": "types", 
        "cond": { 
          "$and": [{ "$eq": [ "$$types.type", "Object1" ] }] 
        }
      } 
    }
  }
}

Было бы лучше, если бы я мог перебрать свой arrayOfObjects и получить тот же результат без предварительного знания типа.

Привет, немного неясно, что вы пытаетесь сделать. Перечисленные вами данные результатов кажутся произвольно собранными из документа, но, насколько я могу судить, вы хотите получить все результаты, сгруппированные по "type", верно? Пожалуйста, уточните и отформатируйте код.

Connor Low 24.12.2020 01:17

Привет, Коннор Лоу, большое спасибо, я хочу сгруппировать одинаковые типы в новый массив и поместить этот массив в корень документа; я нашел выход, но мне нужно знать все типы, которые у меня есть: { "$addFields" : { "Object1" : { "$filter": { "input": "$arrayOfObjects", "as": " типы", "cond": { "$and": [{ "$eq": [ "$$types.type", "Object1" ] }] }} }] Было бы лучше, если бы я мог зацикливаться на своем arrayOfObjects и получить тот же результат без предварительного знания типа

SeekingKnowledge 24.12.2020 01:40
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Может быть, есть более простой вариант, чем этот,

  • $unwind деконструировать arrayOfObjects массив
  • $group по _id, type and elem, построить массив arrayOfObjects
  • $arrayToObject преобразовать k и v из массива в объект
  • $group по _id и объединить объекты в корне
db.collection.aggregate([
  { $unwind: "$arrayOfObjects" },
  {
    $group: {
      _id: {
        type: "$arrayOfObjects.type",
        _id: "$_id"
      },
      elem: { $first: "$elem" },
      arrayOfObjects: { $push: "$arrayOfObjects" }
    }
  },
  {
    $group: {
      _id: "$_id._id",
      elem: { $first: "$elem" },
      arrayOfObjects: { 
        $mergeObjects: {
          $arrayToObject: [[
              {
                k: "$_id.type",
                v: "$arrayOfObjects"
              }
          ]]
        }
      }
    }
  }
])

Детская площадка

Другие вопросы по теме