MongoDB的学习--聚合
最近要去的新项目使用mysql,趁着还没忘记,总结记录以下MongoDB的聚合。
聚合是泛指各种可以处理批量记录并返回计算结果的操作。MongoDB提供了丰富的聚合操作,用于对数据集执行计算操作。在 mongod 实例上执行聚合操作可以大大简化应用的代码,并降低对资源的消耗。
在MongoDB中,像查询之类的聚合操作都是使用 集合 中的文档作为输入,最终的结果会输出一个或者多个文档。
聚合管道
聚合管道是一个基于数据处理管道概念的框架。通过使用一个多阶段的管道,将一组文档转换为最终的聚合结果。(aggregate详细)

聚合管道是映射化简的一个替代方案。而且对于聚合任务来说,聚合管道是一种优选的解决方案,因为映射化简的复杂度可能无法保证。
聚合管道的每个步骤可以使用的内存最多是100MB。如果某个步骤超过了这个限制,MongoDB就会报错了。如果需要处理大量数据,可以使用 allowDiskUse 这个选项,此时管道会把数据写入临时文件。
有的管道阶段可以使用管道表达式作为运算符。管道表达式可以对输入文档做指定的转换。管道表达式使用一个文档结构体,并且可以包含其他的表达式 。
管道表达式只可以操作当前管道中的文档,不能访问其他的文档:表达式操作可以在内存中完成对文档的转换。
一般来说,表达式是无状态的,并且仅在聚合过程中处于计算状态,除了累计操作符表达式。
使用 $group 操作符的累计操作,需要在管道处理文档的过程中维护自己的状态(例如总数、最大值、最小值和相关数据)。
映射化简
映射化简是一种将大量数据转换为有价值的*聚合*结果的数据处理方式。在MongoDB中,使用mapReduce 命令来执行映射化简的操作。
请看下面的映射化简操作:

在这个映射化简操作中,MongoDB对每个输入文档(例如集合中满足查询条件的文档)执行了*map*操作。映射操作输出了键值对结果。对那些有多个值的关键字,MongoDB执行*reduce*操作,收集并压缩了最终的聚合结果。然后MongoDB把结果保存到一个集合中。化简函数还可以把结果输出到*finalize*函数,进一步对聚合结果做处理,当然这步是可选的。
在MongoDB中,所有的映射化简函数都是使用JavaScript编写,并且运行在 mongod 进程中。映射化简操作使用一个集合中文档作为*输入*,并且可以在映射阶段之前执行任意的排序和限定操作。mapReduce 命令可以把结果作为一个文档来返回,也可以把结果写入集合。输入集合和输出集合可以是分片的。
如果选择映射化简操作即时返回结果,这些文档一定要在 BSON文档大小 限制以内,当前这个限制是16MB。
单一用途的聚合
聚合指的是一大类对数据集执行运算的方法,这些方法对输入数据执行特定的步骤从而计算出一个结果。MongoDB提供了一组对数据集执行特定操作的聚合方法。
尽管与聚合管道和映射化简比起来,它们的使用范围有限,但是这些方法的名称很直观的表达了它的功能,非常易于理解使用。
1) 总数
MongoDB可以返回符合查询条件的文档总数。除了 count 命令, mongo 脚本程序中的 count() 方法和 cursor.count() 方法都可以得到文档总数。
例子
现在有一个名为 records 的集合中 只有 下面这些文档:
{ a: 1, b: 0 }
{ a: 1, b: 1 }
{ a: 1, b: 4 }
{ a: 2, b: 2 }
下面的操作会统计集合中的文档个数,并最终返回数字 4:
db.records.count()
下面的操作会统计字段 a 的值是 1 的文档个数,最终返回 3:
db.records.count({a: 1})
2) 去除重复
去除重复 操作会返回查询到的指定字段值不重复的记录。在 mongo 脚本程序中,使用 distinct 命令或者 db.collection.distinct() 方法执行去重。请看下面的去除重复的例子:

例子
现在有一个名为 records 的集合中 只有 下面这些文档:
{ a: 1, b: 0 }
{ a: 1, b: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 4 }
{ a: 2, b: 2 }
{ a: 2, b: 2 }
请看下面使用 db.collection.distinct() 方法对字段 b 进行去除重复的操作:
db.records.distinct("b")
这个操作的结果是:
[ 0, 1, 4, 2 ]
3) 分组
分组 操作会把查询到的文档按照给定的字段值进行分组。分组操作会返回一个文档数组,其中的每个文档包含了一组文档的计算结果。
可以在 mongo 脚本程序中通过 group 命令或者 db.collection.group() 方法来使用分组的功能。
group 命令不能在分片集合上运行。特别需要注意一点, group 操作的结果集大小不能超过16MB。
例子
现在有一个名为 records 的集合,它包含有如下文档:
{ a: 1, count: 4 }
{ a: 1, count: 2 }
{ a: 1, count: 4 }
{ a: 2, count: 3 }
{ a: 2, count: 1 }
{ a: 1, count: 5 }
{ a: 4, count: 4 }
请考虑用 group 命令对集合中的文档进行分组,分组条件是字段 a 值小于 3 ,同时需要对每组的count 字段计数:
db.records.group({
key: {a: 1},
cond: {a: {$lt: 3}},
reduce: function(cur, result) { result.count += cur.count },
initial: {count: 0}
})
这次分组操作的结果是:
[
{a: 1, count: 15},
{a: 2, count: 4}
]
摘录参考:MongoDB中文文档
MongoDB的学习--聚合的更多相关文章
- NoSQL之【MongoDB】学习(三):配置文件说明
摘要: 继上一篇NoSQL之[MongoDB]学习(一):安装说明 之后,知道了如何安装和启动MongoDB,现在对启动时指定的配置文件(mongodb.conf)进行说明,详情请见官方. 启动Mon ...
- [转载]MongoDB开发学习(2)索引的基本操作
索引能够极大的提高查询的效率.在数据库中简历索引必不可少. 在MongoDB中可以很轻松的创建索引. 默认索引_id_ 开启MongoDB服务器,创建数据库cnblogs,创建集合Users .(关于 ...
- 双刃剑MongoDB的学习和避坑
双刃剑MongoDB的学习和避坑 MongoDB 是一把双刃剑,它对数据结构的要求并不高.数据通过key-value的形式存储,而value的值可以是字符串,也可以是文档.所以我们在使用的过程中非常方 ...
- MongoDB的学习--索引类型和属性(转)
原文链接:MongoDB的学习--索引类型和属性 索引类型 MongDB的索引分为以下几种类型:单键索引.复合索引.多键索引.地理空间索引.全文本索引和哈希索引 单键索引(Single Field I ...
- 在MongoDB中实现聚合函数
在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加. ...
- mongodb数据库学习【安装及简单增删改查】
//@desn:mongodb数据库学习 //@desn:码字不宜,转载请注明出处 //@author:张慧源 <turing_zhy@163.com> //@date:2018/08/ ...
- mongodb与sql聚合对应图 M
mongodb与sql聚合对应图 M - CSDN博客 http://blog.csdn.net/u011930016/article/details/49422425 SQL Terms, Func ...
- MongoDB入门学习(一):MongoDB的安装和管理
以前用MySQL数据库,整天都是写大堆大堆的SQL语句,要记住这些SQL关键字都要花好几天时间,写的蛋都爆了,当接触到MongoDB的时候,发现不用写SQL,瞬间觉得高大上,瞬间产生了学习使用它的冲动 ...
- Mongodb 的学习
传送门: # 官方网站 及 下载地址 https://www.mongodb.com/download-center/enterprise/releases # 之前简单学习的笔记http://www ...
随机推荐
- 查看当前正在运行的activity
找到sdk的安装路径,比如我的是 D:\prostu\Android\android-sdk\tools该路径下的: hierarchyviewer.bat 双击,可以用此工具查看设备跑的是当前的哪个 ...
- win server服务安装
从一台机子的服务移到我的测试环境中: 1.copy 100pC上的服务目录(d:\...)到13PC中
- UIWebView和Js交互
在日常的ios项目开发中,我们经常会在原生应用中嵌入web页面,通常我们只是进行一个展示,没有其它的一些功能.但是也有一些项目中需要web页面中的html和native进行交互.但是ios sdk 并 ...
- Java中HashMap等的实现要点浅析
@南柯梦博客中的系列文章对Jdk中常用容器类ArrayList.LinkedList.HashMap.HashSet等的实现原理以代码注释的方式给予了说明(详见http://www.cnblogs.c ...
- Gbase配置
喵了个咪的.到目前为止,自己已经用过SQL SERVER,My SQL,Oracle,SQLite,加上南大通用GBASE 五种数据库了.虽然每种都用的不深 注:GBASE提供了C的API,查看手册即 ...
- FSM 浅谈
之前写过一篇关于状态机的,上一篇讲过的我也就不再罗嗦了,不知道欢迎去查看我的上一篇随笔,主要是感觉上次自己封装的还是不行,所以又进行修改了一番! 我本人是个菜鸟,最开始接触状态机的时候,状态机一个可厉 ...
- 【Win10】UAP/UWP/通用 开发之 RelativePanel
[Some information relates to pre-released product which may be substantially modified before it's co ...
- 即时通信系统中如何实现:全局系统通知,并与Web后台集成?【低调赠送:QQ高仿版GGTalk 5.1 最新源码】
像QQ这样的即时通信软件,时不时就会从桌面的右下角弹出一个小窗口,或是显示一个广告.或是一个新闻.或是一个公告等.在这里,我们将其统称为“全局系统通知”.很多使用GGTalk的朋友都建议我加上一个类似 ...
- objective-c(反射)
objective-c中提供类似JAVA的反射特性,给出基本例子如下: #import <Foundation/Foundation.h> @interface ClassA : NSOb ...
- 一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)
这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际 ...