我一直在编写一个聚合管道来显示集合中数据的汇总版本。
文档结构示例:
{
_id: 'abcxyz',
eventCode: 'EVENTCODE01',
eventName: 'SOMEEVENT',
units: 1,
rate: 2,
cost: 2,
distribution: [
{
startDate: 2021-05-31T04:00:00.000+00:00
units: 1
}
]
}
我已将其分组并将分布合并为单个列表,$unwind
步在$group
之前:
[
$unwind: {
path: '$distribution',
preserveNullAndEmptyArrays: false
},
$group: {
_id: {
eventName: '$eventName',
eventCode: '$eventCode'
},
totalUnits: {
$sum: '$units'
},
distributionList: {
$push: '$distribution'
},
perUnitRate: {
$avg: '$rate'
},
perUnitCost: {
$avg: '$cost'
}
}
]
样本输出:
{
_id: {
eventName: 'EVENTNAME101'
eventCode: 'QQQ'
},
totalUnits: 7,
perUnitRate: 2,
perUnitCost: 2,
distributionList: [
{
startDate: 2021-05-31T04:00:00.000+00:00,
units: 1
},
{
startDate: 2021-05-31T04:00:00.000+00:00,
units: 1
},
{
startDate: 2021-06-07T04:00:00.000+00:00,
units: 1
}
]
}
我在下一步卡住了;我想把distributionList
合并到一个没有重复startDate
的新列表中。
示例:由于distributionList的前两个对象具有相同的startDate,因此它应该是输出的单个对象,其单位之和:
预期:
{
_id: {
eventName: 'EVENTNAME101'
eventCode: 'QQQ'
},
totalUnits: 7,
perUnitRate: 2,
perUnitCost: 2,
newDistributionList: [
{
startDate: 2021-05-31T04:00:00.000+00:00,
units: 2 //units summed for first 2 objects
},
{
startDate: 2021-06-07T04:00:00.000+00:00,
units: 1
}
]
}
我不能使用$unwind
或$bucket
,因为我打算保持我在前面的步骤中所做的分组($group
)。
您可能希望在eventName, eventCode, distribution.startDate
级别执行第一个$group
。然后,您可以在eventName, eventCode
级别再次使用$group
,并使用$first
来保留原始的$group
字段。
下面是Mongo Playground展示的思路,供大家参考。