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方案。

posted @ 2016-01-03 16:14  人生设计师  阅读(384)  评论(0编辑  收藏  举报