需要一些帮助来编写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
}
]
},
]
是否有关于最佳方法的想法? 我现在的解决方案非常丑陋-如果不执行多个查询就无法实现。
答案 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 } }
])