从分组 mongo 聚合中的对象数组创建对象
Creating objects from array of objects in a grouped mongo aggregation
我一直在编写聚合管道来显示集合中数据的汇总版本。
文档结构示例:
{
_id: 'abcxyz',
eventCode: 'EVENTCODE01',
eventName: 'SOMEEVENT',
units: 1,
rate: 2,
cost: 2,
distribution: [
{
startDate: 2021-05-31T04:00:00.000+00:00
units: 1
}
]
}
我已将其分组并在 $group
:
之前使用 $unwind
步骤将分布合并到一个列表中
[
$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 的前 2 个对象具有相同的开始日期,它应该是输出中的单个对象,单位总和:
预计:
{
_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展示的思路,供大家参考。
我一直在编写聚合管道来显示集合中数据的汇总版本。
文档结构示例:
{
_id: 'abcxyz',
eventCode: 'EVENTCODE01',
eventName: 'SOMEEVENT',
units: 1,
rate: 2,
cost: 2,
distribution: [
{
startDate: 2021-05-31T04:00:00.000+00:00
units: 1
}
]
}
我已将其分组并在 $group
:
$unwind
步骤将分布合并到一个列表中
[
$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 的前 2 个对象具有相同的开始日期,它应该是输出中的单个对象,单位总和:
预计:
{
_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展示的思路,供大家参考。