MongoDB查询-聚合和嵌入式文档

时间:2019-08-23 03:25:17

标签: mongodb mongoose aggregation-framework

需要一些帮助来编写MongoDB查询。

背景:我正在构建一个跟踪捐款的应用程序。 我在ExpressJS中创建了一个API,并且正在使用Mongoose连接到MongoDB。

我有一个名为Donations的MongoDB集合,看起来像这样:

[
    {
        donor: 123,
        currency: 'CAD',
        donationAmount: 50
    },
    {
        donor: 123,
        currency: 'USD',
        donationAmount: 50
    },
    {
        donor: 789,
        currency: 'CAD',
        donationAmount: 50
    },
    {
        donor: 123,
        currency: 'CAD',
        donationAmount: 50
    }
]

对于每个捐赠者,我需要总结每种货币的捐赠总额。 理想情况下,我想要一个可以产生以下数据集的MongoDB查询。 (我对结构很灵活,我唯一的要求是结果中:1)每个捐赠者只有一个且只有一个文档; 2)此文档包含每种货币类型的总和)

[
    {
        donor: 123,
        donations: [
            {
                CAD : 100,
            },
            {
                USD : 50
            }
        ]
    },
    {
        donor: 789,
        donations: [
            {
                CAD: 50
            }
        ]
    },
]

是否有关于最佳方法的想法? 我现在的解决方案非常丑陋-如果不执行多个查询就无法实现。

1 个答案:

答案 0 :(得分:2)

您可以运行$group两次,并使用$arrayToObject动态构建密钥:

Model.aggregate([
    { $group: { _id: { donor: "$donor", currency: "$currency" }, sum: { $sum: "$donationAmount" } } },
    { $group: { _id: "$_id.donor", donations: { $push: { $arrayToObject: [[{ k: "$_id.currency", v: "$sum" }]] } } } },
    { $project: { _id: 0, donor: "$_id", donations: 1 } }
])

Mongo Playground

相关问题