MongoDB 聚合管道

MongoDB 聚合管道

ID:39360871

大小:1.82 MB

页数:16页

时间:2019-07-01

MongoDB 聚合管道_第1页
MongoDB 聚合管道_第2页
MongoDB 聚合管道_第3页
MongoDB 聚合管道_第4页
MongoDB 聚合管道_第5页
资源描述:

《MongoDB 聚合管道》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、MongoDB聚合管道(AggregationPipeline) 作者:张善友    管道概念POSIX多线程的使用方式中,有一种很重要的方式-----流水线(亦称为“管道”)方式,“数据元素”流串行地被一组线程按顺序执行。它的使用架构可参考下图:以面向对象的思想去理解,整个流水线,可以理解为一个数据传输的管道;该管道中的每一个工作线程,可以理解为一个整个流水线的一个工作阶段stage,这些工作线程之间的合作是一环扣一环的。靠输入口越近的工作线程,是时序较早的工作阶段stage,它的工作成果会影响下一个工作线程阶段(s

2、tage)的工作结果,即下个阶段依赖于上一个阶段的输出,上一个阶段的输出成为本阶段的输入。这也是pipeline的一个共有特点!为了回应用户对简单数据访问的需求,MongoDB2.2版本引入新的功能聚合框架(AggregationFramework),它是数据聚合的一个新框架,其概念类似于数据处理的管道。每个文档通过一个由多个节点组成的管道,每个节点有自己特殊的功能(分组、过滤等),文档经过管道处理后,最后输出相应的结果。管道基本的功能有两个:一是对文档进行“过滤”,也就是筛选出符合条件的文档;二是对文档进行“变换”,

3、也就是改变文档的输出形式。其他的一些功能还包括按照某个指定的字段分组和排序等。而且在每个阶段还可以使用表达式操作符计算平均值和拼接字符串等相关操作。管道提供了一个MapReduce的替代方案,MapReduce使用相对来说比较复杂,而管道的拥有固定的接口(操作符表达),使用比较简单,对于大多数的聚合任务管道一般来说是首选方法。该框架使用声明性管道符号来支持类似于SQLGroupBy操作的功能,而不再需要用户编写自定义的JavaScript例程。大部分管道操作会在“aggregate”子句后会跟上“$match”打头。它

4、们用在一起,就类似于SQL的from和where子句,或是MongoDB的find函数。“$project”子句看起来也非常类似SQL或MongoDB中的某个概念(和SQL不同的是,它位于表达式尾端)。接下来介绍的操作在MongoDB聚合框架中是独一无二的。与大多数关系数据库不同,MongoDB天生就可以在行/文档内存储数组。尽管该特性对于全有全无的数据访问十分便利,但是它对于需要组合投影、分组和过滤操作来编写报告的工作,却显得相当复杂。“$unwind”子句将数组分解为单个的元素,并与文档的其余部分一同返回。“$gr

5、oup”操作与SQL的GroupBy子句用途相同,但是使用起来却更像是LINQ中的分组运算符。与取回一行平面数据不同,“$group”操作的结果集会呈现为一个持续的嵌套结构。正因如此,使用“$group”可以返回聚合信息,例如对于每个分组中的实际文档,计算文档整体或部分的数目和平均值。管道操作符管道是由一个个功能节点组成的,这些节点用管道操作符来进行表示。聚合管道以一个集合中的所有文档作为开始,然后这些文档从一个操作节点流向下一个节点,每个操作节点对文档做相应的操作。这些操作可能会创建新的文档或者过滤掉一些不符合条件的

6、文档,在管道中可以对文档进行重复操作。先看一个管道聚合的例子:管道操作符的种类:管道操作符详细使用说明1.$project:数据投影,主要用于重命名、增加和删除字段例如:db.article.aggregate({$project:{title:1,author:1,}});这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:db.article.aggregate({$project:{_id:0,title:1,author:1}});也

7、可以在$project内使用算术类型表达式操作符,例如:db.article.aggregate({$project:{title:1,doctoredPageViews:{$add:["$pageViews",10]}}});通过使用$add给pageViews字段的值加10,然后将结果赋值给一个新的字段:doctoredPageViews注:必须将$add计算表达式放到中括号里面除此之外使用$project还可以重命名字段名和子文档的字段名:db.article.aggregate({$project:{title

8、:1,page_views:"$pageViews",bar:"$other.foo"}});也可以添加子文档:db.article.aggregate({$project:{title:1,stats:{pv:"$pageViews",foo:"$other.foo",dpv:{$add:["$pageViews",10]}}}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。