MongoDB实战指南(五):MongoDB中的聚集分析
聚集操作是对数据进行分析的有效手段。MongoDB主要提供了三种对数据进行分析计算的方式:管道模式聚集分析,MapReduce聚集分析,简单函数和命令的聚集分析。
1. 管道模式进行聚集
这里所说的管道类似于Unix上的管道命令。数据通过一个多步骤的管道,每个步骤都会对数据进行处理,最后返回需要的结果集。管道提供了高效的数据分析流程,是MongoDB中首选的数据分析方法。一个典型的管道操作流程如下图所示:
聚集管道操作流程图
上图对应的操作语句如下图所示:
db.book.aggregate([{$match:{status:"normal"},{$group:{_id:"$book_id",total:{$sum:"$num"}}}])
数据依次通过数组中的各管道操作符进行处理,常用的管道操作符有以下几个。
$match:过滤文档,只传递匹配的文档到管道中的下一个步骤。
$limit:限制管道中文档的数量。
$skip:跳过指定数量的文档,返回剩下的文档。
$sort:对所有输入的文档进行排序。
$group:对所有文档进行分组然后计算聚集结果。
$out:将管道中的文档输出到一个具体的集合中。这个必须是管道操作中的最后一步。
与$group操作一起使用的计算聚集值的操作符有以下几个。
$first:返回group操作后的第一值。
$last:返回group操作后的最后一个值。
$max:返回group操作后的最大值。
$mix:返回group操作后的最小值。
$avg:返回group操作后的平均值。
$sum:返回group操作后所有值的和。
2. MapReduce模式聚集
MongoDB也提供了当前流行的MapReduce的并行编程模型,为海量数据的查询分析提供了一种更加高效的方法,用MongoDB做分布式存储,然后再用MapReduce来做分析。具体内容参考相关书籍。
3. 简单聚集函数
管道模式和MapReduce模式都是重型武器,基本上可以解决数据分析中的所有问题,但有时在数据量不是很大的情况下,直接调用基于集合的函数会更简单,常用的简单聚集函数有以下几种。
3.1 distinct函数,用于返回不重复的记录,返回值是数组,函数原型如下。
db.orders.distinct(key,<query>)
第一个参数为field,第二个参数为查询选择器,返回值不能大于系统规定的单个文档的最大值。
3.2 count函数,用于统计查询返回的记录总数,函数原型如下所示。
db.collection.find(<query>).count()
3.3 group函数,group函数与distinct函数一样,返回的结果集不能大于16M,不能在分片集群上进行操作且group不能处理超过10000个唯一键值。如果聚集操作超过了这个限制,只有使用上面介绍的管道聚集或MapReduce方案。