MongoDB按id对文档进行分组,并合并文档中匹配的数组元素



我试图使用Mongo聚合框架按id分组文档,然后将每个文档的'事件'数组合并为一个数组。我尝试过不同的组累加器;Push, first, last等等。使用push会产生一个数组的数组。但我想要一个包含所有事件对象的数组。MongoDB 4.4

文件

{
_id: 123,
name: "John",
events: [
{
start: "2020-01-01",
end: "2020-01-01"
},
{
start: "2020-01-01",
end: "2020-01-01"
}
]
},
{
_id: 123,
name: "John",
events: [
{
start: "2020-01-21",
end: "2020-01-21"
},
]
},
{
_id: 456,
name: "Ben",
events: [
{
start: "2020-01-21",
end: "2020-01-21"
},
]
},
{
_id: 456,
name: "Ben",
events: [
{
start: "2020-02-01",
end: "2020-02-01"
},
]
},

My group aggregate

'$group': {
'_id': '$_id',
'resourceName': {
'$first': '$name',
},
'events': {
'$push': "$events"
}
}

所需输出

[
{
_id: 123,
name: "John",
events: [
{
start: "2020-01-01",
end: "2020-01-01"
},
{
start: "2020-01-01",
end: "2020-01-01"
},
{
start: "2020-01-21",
end: "2020-01-21"
},
]
},
{
_id: 456,
name: "Ben",
events: [
{
start: "2020-02-01",
end: "2020-02-01"
},
{
start: "2020-01-21",
end: "2020-01-21"
},
]
},
]

使用$unwind来平展源数组,然后使用$addToSet来删除重复项。

数据:

cc.insert_many([{
foo: 1,
bar: [10, 11],
}, {
foo: 1,
bar: [10, 21],
}, {
foo: 2,
bar: [30, 31],
}])
[{"$unwind"=>"$bar"},
{"$group"=>{"_id"=>"$foo", "bar"=>{"$addToSet"=>"$bar"}}}]
[{"_id"=>2, "bar"=>[30, 31]}, {"_id"=>1, "bar"=>[21, 10, 11]}]

最新更新