![](/img/trans.png)
[英]How to group documents by matching array elements with MapReduce in MongoDB?
[英]MongoDB group documents by id and merge matching array elements from the documents
我正在嘗試使用 Mongo 聚合框架按 id 對文檔進行分組,然后將每個文檔中的“事件”數組合並到一個數組中。 我嘗試過不同的組累加器; push, first, last 等。通過 push 會產生一個 arrays 數組。 但我想要一個包含所有事件對象的數組。 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"
},
]
},
我的群組匯總
'$group': {
'_id': '$_id',
'resourceName': {
'$first': '$name',
},
'events': {
'$push': "$events"
}
}
所需 output
[
{
_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 將源 arrays 展平,然后使用 $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]}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.