mongodb - 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"
},
]
},
我的群组汇总
'$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]}]
推荐阅读
- csv - JMeter:如何根据列值读取 csv 文件中的特定行数据并将该列的值传递给采样器?
- swift - SwiftUI 目标视图的额外元素
- javascript - 创建允许导入单个模块的 Angular 9 库 (ng-packagr)
- javascript - 围绕 Javascript 中的“嵌套”try/catch 语句感到困惑
- ios - 如何在 Swift 中解决这个计时器问题?
- performance - 导出数据到csv文件:sqlplus vs sqlcl parallel vs pl/sql utl_file dbms_parallel_execute,哪个更快
- azure-mysql-database - 未找到 Azure 服务器名称
- java - 在hostinger.com上调用JSON时出现意外的响应代码503错误
- azure - Azure 流分析 - 使用参考数据时没有输入事件
- excel - 我们可以像这样改变形状或对象组的边框颜色吗?