如何在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上循环并在不预先知道类型的情况下获得相同的结果,那将是最好的。

可能会有比这更简单的选择,

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

游乐场

相关内容

  • 没有找到相关文章

最新更新