设为首页 加入收藏

TOP

MongoDB学习笔记——聚合
2015-11-12 21:29:18 来源: 作者: 【 】 浏览:5
Tags:MongoDB 学习 笔记 聚合

最近要去的新项目使用mysql,趁着还没忘记,总结记录以下MongoDB的聚合。


聚合是泛指各种可以处理批量记录并返回计算结果的操作。MongoDB提供了丰富的聚合操作,用于对数据集执行计算操作。在?mongod?实例上执行聚合操作可以大大简化应用的代码,并降低对资源的消耗。


在MongoDB中,像查询之类的聚合操作都是使用?集合?中的文档作为输入,最终的结果会输出一个或者多个文档。


聚合管道是一个基于数据处理管道概念的框架。通过使用一个多阶段的管道,将一组文档转换为最终的聚合结果。(aggregate详细)



聚合管道是映射化简的一个替代方案。而且对于聚合任务来说,聚合管道是一种优选的解决方案,因为映射化简的复杂度可能无法保证。


聚合管道的每个步骤可以使用的内存最多是100MB。如果某个步骤超过了这个限制,MongoDB就会报错了。如果需要处理大量数据,可以使用?allowDiskUse?这个选项,此时管道会把数据写入临时文件。


有的管道阶段可以使用管道表达式作为运算符。管道表达式可以对输入文档做指定的转换。管道表达式使用一个文档结构体,并且可以包含其他的表达式?。


管道表达式只可以操作当前管道中的文档,不能访问其他的文档:表达式操作可以在内存中完成对文档的转换。


一般来说,表达式是无状态的,并且仅在聚合过程中处于计算状态,除了累计操作符表达式。


使用?$group?操作符的累计操作,需要在管道处理文档的过程中维护自己的状态(例如总数、最大值、最小值和相关数据)。


映射化简是一种将大量数据转换为有价值的*聚合*结果的数据处理方式。在MongoDB中,使用mapReduce?命令来执行映射化简的操作。


请看下面的映射化简操作:



在这个映射化简操作中,MongoDB对每个输入文档(例如集合中满足查询条件的文档)执行了*map*操作。映射操作输出了键值对结果。对那些有多个值的关键字,MongoDB执行*reduce*操作,收集并压缩了最终的聚合结果。然后MongoDB把结果保存到一个集合中。化简函数还可以把结果输出到*finalize*函数,进一步对聚合结果做处理,当然这步是可选的。


在MongoDB中,所有的映射化简函数都是使用java script编写,并且运行在?mongod?进程中。映射化简操作使用一个集合中文档作为*输入*,并且可以在映射阶段之前执行任意的排序和限定操作。mapReduce?命令可以把结果作为一个文档来返回,也可以把结果写入集合。输入集合和输出集合可以是分片的。


如果选择映射化简操作即时返回结果,这些文档一定要在?BSON文档大小?限制以内,当前这个限制是16MB。


聚合指的是一大类对数据集执行运算的方法,这些方法对输入数据执行特定的步骤从而计算出一个结果。MongoDB提供了一组对数据集执行特定操作的聚合方法。


尽管与聚合管道和映射化简比起来,它们的使用范围有限,但是这些方法的名称很直观的表达了它的功能,非常易于理解使用。


MongoDB可以返回符合查询条件的文档总数。除了?count?命令,?mongo?脚本程序中的?count()?方法和?cursor.count()?方法都可以得到文档总数。


例子


现在有一个名为?records?的集合中?只有?下面这些文档:


下面的操作会统计集合中的文档个数,并最终返回数字?4:


下面的操作会统计字段?a?的值是?1?的文档个数,最终返回?3:


去除重复?操作会返回查询到的指定字段值不重复的记录。在?mongo?脚本程序中,使用?distinct?命令或者?db.collection.distinct()?方法执行去重。请看下面的去除重复的例子:



例子


现在有一个名为?records?的集合中?只有?下面这些文档:


请看下面使用?db.collection.distinct()?方法对字段?b?进行去除重复的操作:


这个操作的结果是:


更多MongoDB相关内容可以看看以下的有用链接:?


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇使用XtraBackup给MySQL在线增量备.. 下一篇DB2表空间重定向恢复数据库实战

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: