MongoDB聚合查询中$sum函数用法及相关语法疑问
MongoDB聚合查询疑问解答
原始聚合代码
db.sales.aggregate( [ { $group: { _id: { day: { $dayOfYear: "$date"}, year: { $year: "$date" } }, totalAmount: { $sum: { $multiply: [ "$price", "$quantity" ] } }, count: { $sum: 1 } } } ] )
执行输出
{ "_id" : { "day" : 46, "year" : 2014 }, "totalAmount" : 150, "count" : 2 } { "_id" : { "day" : 34, "year" : 2014 }, "totalAmount" : 45, "count" : 2 } { "_id" : { "day" : 1, "year" : 2014 }, "totalAmount" : 20, "count" : 1 }
疑问解答
1. 为何不能直接用totalAmount: { $multiply: [ "$price", "$quantity" ] }替代?
$group阶段的核心是按指定_id将文档分组,每组最终只输出一条汇总文档。如果直接使用$multiply,它只会提取分组内任意单条文档的price和quantity计算乘积,无法实现整个分组的金额累加。
而$sum: { $multiply: ... }的逻辑是:先对分组内每一条文档计算单条记录的金额(price*quantity),再把所有单条金额累加,最终得到该分组的总销售额,这才是我们需要的分组汇总结果。
2. count: { $sum: 1 }的工作原理及数字1的作用?
$sum在$group阶段会对分组内的每一条文档执行累加操作。这里的数字1是计数单位:每遍历到分组内的一条文档,就往累加器中加1。遍历完分组内所有文档后,累加的结果就是该分组的文档总数,也就是每组的销售记录条数。
内容的提问来源于stack exchange,提问作者ZeroAutumn
相关产品推荐
相关产品推荐

