聚合(Aggregation)为集合文档数据提供各种处理数据方法,并返回计算结果。
MongoDB提供了3种方式来执行聚合命令:
- 聚合管道方法
- map-reduce方法
- 单一目标聚合方法
1. 聚合管道方法
聚合管道方法又可以直接理解为合计流水线法,就是把集合里若干含数值型的文档记录,其键对应的值进行各种分类统计。该方法支持分片集合操作。
db.collection_name.aggregate(
[
{$match:{<field>}}, //统计查找条件
{$group:{<field1>, <field2>}} //field1为分类字段;field2为含各种统计操作符的数值型字段,如$sum、$avg、$min、$max、$push、$addToSet、$first、$last操作符
]
)
//aggregate命令作用类似SQL语言里的group by语句的使用方法
聚合分类统计
按goodsid分类统计amount字段的总数量:
注意:
_id:"$goodsid", goodsid为分类字段名,_id为必须指定唯一性字段,不能改为其它名称的字段;
total为统计结果字段名,可以是任意的符合起名规则的新名称。
$sum为求和操作符号
$amount为求和字段,必须加上双引号
map-reduce方法
db.collection_name.mapreduce(
function(){emit(<this.field1>, <this.field2>)},
function(key,values){return array.sum(values)},
{query:{<field>}, out:<resultname">}
)
说明:
function(){emit(<this.field1>, <this.field2>)},把集合对应的字段<field1><field2>进行map操作
function(key,values){return array.sum(values)},对map过来的field1,field2进行reduce操作,求得sum值
把field1值和求得值连同out:<"resultname">一起返回
query:{<field>}在集合里查询符合<field>条件的文档。
注意:该方式进行聚合运算,效率铰聚合管道方式要低,而且使用更复杂。
单一目标聚合方法
该方法下,目前有两种聚合操作功能:
- db.collection_name.count()
- db.collection_name.distinct()
1. 统计文档数量:
db.collection_name.count(query, options)
说明:统计集合里符合查询条件的文档数量,query为查询条件,option参数如下表
名称 | 类型 | 说明 |
---|---|---|
limit | integer | 限制要计数的文档的最大数量 |
skip | integer | 计数前要跳过的文档数 |
hint | string或document | 对需要查询的索引进行提示或详细说明 |
maxTimeMS | integer | 设置允许查询运行的最长时间 |
readConcern | string | 指定读取关注。默认级别为"local" 指定"majority"级别时,受以下3个条件限制: 1. 必须先启动MongoDB实例 2. 多用于副本集数据库的读关注 3. 使用该级别时,必须指定非空的查询条件 |
统计符合条件的记录数:
从第二条开始统计符合条件的记录数:
2. 统计集合里指定键的不同值:
db.collection_name.distinc(
<key>,
query,
option
)
说明:统计集合里指定键的不同值,并返回结果。
<key>只能指定一个键名,query为集合查找条件,option只提供collations选项
统计指定键的不同值并返回:
另外:单一目标聚合方法,可以直接在find()后加点使用