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

#json #mongodb #mongodb-query #nosql #nosql-aggregation

#json #mongodb #mongodb-запрос #nosql #nosql-агрегация

Вопрос:

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

 {"_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 и получить тот же результат без предварительного знания типа.

Комментарии:

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

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

Ответ №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"
              }
          ]]
        }
      }
    }
  }
])
 

Игровая площадка