У меня есть этот документ:
{"_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
и получить тот же результат без предварительного знания типа.
Привет, Коннор Лоу, большое спасибо, я хочу сгруппировать одинаковые типы в новый массив и поместить этот массив в корень документа; я нашел выход, но мне нужно знать все типы, которые у меня есть: { "$addFields" : { "Object1" : { "$filter": { "input": "$arrayOfObjects", "as": " типы", "cond": { "$and": [{ "$eq": [ "$$types.type", "Object1" ] }] }} }] Было бы лучше, если бы я мог зацикливаться на своем arrayOfObjects и получить тот же результат без предварительного знания типа
Может быть, есть более простой вариант, чем этот,
$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"
}
]]
}
}
}
}
])
Привет, немного неясно, что вы пытаетесь сделать. Перечисленные вами данные результатов кажутся произвольно собранными из документа, но, насколько я могу судить, вы хотите получить все результаты, сгруппированные по
"type"
, верно? Пожалуйста, уточните и отформатируйте код.