如何在MongoDB中汇总总和以获得总数?


70

对于某些具有字段的集合,{ wins: Number }我如何使用MongoDB Aggregation Framework来获取集合中所有文档的获胜总数?

例:

如果我有3个文件wins: 5wins: 8wins: 12分别,我怎么可能使用MongoDB的聚合框架返回的总数,即total: 25


使用docs中$group所示的操作。
JohnnyHK 2013年

@JohnnyHK我试过了,db.characters.aggregate([{$group:{_id:'id',wins:{$sum:1}}}]);但是没有运气。它返回wins我有多少个字段,而不是获胜的值。
Sahat Yalkabov 2013年

10
db.characters.aggregate( [ { $group: { _id: null, total: { $sum: "$wins" } } } ] )
WiredPrairie 2013年

1
@WiredPrairie谢谢你的工作。您要发布它作为答案以便我接受吗?
Sahat Yalkabov

Answers:


156

要在使用MongoDB的聚合框架时获取分组字段的总和,您需要使用$group$sum

db.characters.aggregate([ { 
    $group: { 
        _id: null, 
        total: { 
            $sum: "$wins" 
        } 
    } 
} ] )

在这种情况下,如果要获取所有的总和wins,则需要使用$语法引用字段名,因为语法仅从分组文档中$wins获取wins字段的值并将它们加在一起。

计数

您也可以sum通过传递特定值(如您在注释中所做的那样)来获得其他值。如果你有

{ "$sum" : 1 }

那实际上是所有的计数wins,而不是总数。


如果此查询花费很长时间,您将怎么办?(涉及许多文档)
refaelos

3
由于此算法必须扫描每个文档,因此您需要诉诸缓存,预先计算或过滤结果以减少花费的总时间。
WiredPrairie 2014年

您如何得到结果?我得到一个光标。
chovy

1
为什么需要[ ]?没有它们也可以工作,即db.characters.aggregate({$group ... })代替db.characters.aggregate([{$group ... }])
foob​​arbecue

4
哇,这_id: null 是关键。+1尝试使用聚合框架而不考虑使用_id: null
Pablo Burgos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.