MongoDB聚合查询:按receiverType统计金额及总佣金
解决方案
你可以通过单次全局分组完成所有统计需求,再通过投影转换为目标格式,不需要拆分多个管道:
db.yourCollection.aggregate([ // 全局分组,同时计算各类型金额总和与佣金总额 { $group: { _id: null, storeEarnings: { $sum: { $cond: [{ $eq: ["$receiverType", "STORE"] }, "$amountPaid", 0] } }, restaurantEarnings: { $sum: { $cond: [{ $eq: ["$receiverType", "RESTAURANT"] }, "$amountPaid", 0] } }, shopperEarnings: { $sum: { $cond: [{ $eq: ["$receiverType", "SHOPPER"] }, "$amountPaid", 0] } }, totalRelianceCommission: { $sum: "$relianceCommission" } } }, // 移除多余的_id字段 { $project: { _id: 0, storeEarnings: 1, restaurantEarnings: 1, shopperEarnings: 1, totalRelianceCommission: 1 } } ])
关键逻辑说明
- 全局分组:将
_id设为null,会把集合中所有文档归为一组,这样可以同时计算全局佣金总额和各类型的金额总和。 - 条件累加:用
$cond判断当前文档的receiverType,匹配时累加amountPaid,否则加0,实现按类型统计的效果。 - 投影整理:最后移除自动生成的
_id字段,保留需要的输出字段,完全匹配你要的格式。
对比你之前的分组方式,这种方法只需要一次聚合操作,避免了多次分组或合并结果的麻烦,效率更高。
内容的提问来源于stack exchange,提问作者C0l0red
相关产品推荐
相关产品推荐

