#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"
}
]]
}
}
}
}
])