MongoDB聚合管道(Aggregation Pipeline)
参考聚合管道简介
聚合管道
聚合管道是基于数据处理管道模型的数据聚合框架。文档进入一个拥有多阶段(multi-stage)的管道,并被管道转换成一个聚合结果。最基本的管道阶段提供了跟查询操作类似的过滤和文档转换。其他管道操作提供了根据特殊字段对文档的分组和排序,以及对数组的聚合,包括文档数组。另外,管道阶段可以使用操作符来完成某些任务如计算平均值或者连接字符串。管道阶段可以在管道中出现多次。
如图所示,
聚合管道提供了一种map-reduce的替代方案,并且在map-reduce的复杂性无法保证的情况下,聚合管道可能是一个较好的解决方法。
聚合管道在值类型和结果大小上有一些限制,详细请参考聚合管道限制。
Map-Reduce
MongoDB也提供了map-reduce操作来进行聚合。总的来说,map-reduce操作有两个阶段(phase):map阶段处理每个文档并对每个文档产生一个或多个对象,而reduce阶段则合并map操作的结果。当然,map-reduce也可以有一个最终(finalize)阶段来对结果作一个最终修改,这是可选的。跟其他聚合操作类似,map-reduce可以指定查询条件来对输入文档进行选择,或者对输入文档排序和限制输出文档数量。
Map-reduce使用自定义的JavaScript函数来实现map和reduce操作,以及可选的finalize操作。与聚合管道相比,自定义JavaScript提供了很大的灵活性,所以map-reduce比聚合管道更加灵活,但没有后者效率高。
单一目的聚合操作
对一系列的常用单一目的聚合操作,MongoDB提供了用于专用目的的数据库命令。这些常用的聚合操作是:返回匹配的文档数量,返回某一字段的不相同的值,以及基于某个字段值的分组。所有这些操作从单一集合中聚合文档。这些操作可以实现常见聚合过程,但是它们缺乏灵活性,也不像聚合管道和map-reduce那样可以容纳很多操作阶段。
其他特征和行为
聚合管道和map-reduce都是在分片集合(sharded collection)上操作。Map-reduce操作也可以输入到一个分片集合中。参见聚合管道和分片集合与Map-Reduce和分片集合。
聚合管道在其中的某些阶段可以使用索引提高性能。另外,聚合管道有一个内部优化阶段。详情参见管道符和索引与聚合管道优化。
对聚合管道、map-reduce以及特殊分组功能的特性比较,参见聚合命令比较。
管道操作符的种类:
Name |
Description |
Reshapes a document stream. $project can rename, add, or remove fields as well as create computed values and sub-documents. |
|
Filters the document stream, and only allows matching documents to pass into the next pipeline stage.$match uses standard MongoDB queries. |
|
Restricts the number of documents in an aggregation pipeline. |
|
Skips over a specified number of documents from the pipeline and returns the rest. |
|
Takes an array of documents and returns them as a stream of documents. |
|
Groups documents together for the purpose of calculating aggregate values based on a collection of documents. |
|
Takes all input documents and returns them in a stream of sorted documents. |
|
Returns an ordered stream of documents based on proximity to a geospatial point. |
MongoDB聚合管道(Aggregation Pipeline)的更多相关文章
- MongoDB 聚合(管道与表达式)
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). aggregate() 方法 MongoDB中 ...
- MongoDB 聚合管道(Aggregation Pipeline)
管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...
- MongoDB基础教程系列--第七篇 MongoDB 聚合管道
在讲解聚合管道(Aggregation Pipeline)之前,我们先介绍一下 MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最 ...
- MongoDB聚合管道
通过上一篇文章中,认识了MongoDB中四个聚合操作,提供基本功能的count.distinct和group,还有可以提供强大功能的mapReduce. 在MongoDB的2.2版本以后,聚合框架中多 ...
- mongodb聚合管道用法
基本用法 db.collection.aggregate( [ { <stage> }, ... ] ) stage如下 名称 描述 $addFields 将新的字段添加到文档中,输出的文 ...
- MongoDB 聚合管道
参见:http://www.cnblogs.com/liruihuan/p/6686570.html MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进 ...
- MongoDB 聚合管道(aggregate)
1.aggregate() 方法 我们先插入一些测试数据 { "_id" : ObjectId("5abc960c684781cda6d38027"), &qu ...
- 【mongoDB查询进阶】聚合管道(一) -- 初识
https://segmentfault.com/a/1190000010618355 前言:一般查询可以通过find方法,但如果是比较复杂的查询或者数据统计的话,find可能就无能为力了,这时也许你 ...
- 快速掌握mongoDB(二)——聚合管道和MapReduce
上一节简单介绍了一下mongoDB的增删改查操作,这一节将介绍其聚合操作.我们在使用mysql.sqlserver时经常会用到一些聚合函数,如sum/avg/max/min/count等,mongoD ...
随机推荐
- 在GNU/Linux下使用Lilypond排版简谱
尽管GNU/Linux并非无所不能,但确实能在很多时候提供免费.开放的解决方案.这两天我想做一个简谱,在网上搜索乐谱排版软件,发现了基于GPL协议的Lilypond软件.只不过Lilypond是用来做 ...
- jquery 图片遮罩 坠落遮挡效果
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 敏捷开发(六)- SCRUM全员会议
本文主要是为了检测你对SCRUM 全员会议的了解和使用程度,通过本文你可以检测一下 1.你们的SCRUM 全员会议的过程和步骤 2.SCRUM 全员会议的输出结果 一.会议目的 组成团 ...
- Python学习笔记——基础篇【第四周】——迭代器&生成器、装饰器、递归、算法、正则表达式
目录 1.迭代器&生成器 2.装饰器 a.基本装饰器 b.多参数装饰器 3.递归 4.算法基础:二分查找.二维数组转换 5.正则表达式 6.常用模块学习 #作业:计算器开发 a.实现加减成熟及 ...
- Unity发布安卓无法读取StreamingAssets文件下数据库的问题
在移动端StreamingAssets下的文件是只读的,但大家可能跟我一样遇到了发布安卓以后放在StreamingAssets下的数据库文件一样读取不了, 但其实这个文件夹其实是可以读取到的,所以我们 ...
- c++中宽字节表示
1.C++语言中_T Visual C++里边定义字符串的时候,用_T来保证兼容性,VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候 ...
- Chapter 19_0 位操作库
位操作库是Lua5.2版本里添加的库,所有函数放在bit32 table里.(bit32只能针对32位整数运算) 在Lua5.3版本里,bit32库被废弃掉.不过可以使用一个外部兼容库,但是最好直接用 ...
- Django之模型管理器filter处理问题
今天上班第一天,恭祝所有朋友新年快乐!! 最近在github上发现一个还不错的基于Django的开源博客项目,不过也许是版本原因,其中代码存在着些许问题,今天主要记录下其中的模型处理方法的部分. 这段 ...
- centos6.8安装superctl 后台管理工具
下载安装python yum install python-setuptools 从官网下载supervisor包 https://pypi.python.org/pypi/supervisor 解压 ...
- removeObjectAtIndex
CGFloat lableW = (baseViewWidth - 2)/3;// dcj20150724,减2是为了解决字体模糊的问题,因为设置了边框. 原因是下面引起的 titleview.lay ...