从分组 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展示的思路,供大家参考。