管道概念
以面向对象的思想去理解,整个流水线,能够理解为一个数据传输的管道;该管道中的每个工做线程,能够理解为一个整个流水线的一个工做阶段stage,这些工做线程之间的合做是一环扣一环的。靠输入口越近的工做线程,是时序较早的工做阶段stage,它的工做成果会影响下一个工做线程阶段(stage)的工做结果,即下个阶段依赖于上一个阶段的输出,上一个阶段的输出成为本阶段的输入。这也是pipeline的一个共有特色!mongodb
为了回应用户对简单数据访问的需求,MongoDB2.2版本引入新的功能聚合框架(Aggregation Framework) ,它是数据聚合的一个新框架,其概念相似于数据处理的管道。 每一个文档经过一个由多个节点组成的管道,每一个节点有本身特殊的功能(分组、过滤等),文档通过管道处理后,最后输出相应的结果。管道基本的功能有两个:框架
一是对文档进行“过滤”,也就是筛选出符合条件的文档;
二是对文档进行“变换”,也就是改变文档的输出形式;工具
管道操做符:spa
管道操做符 | Description |
$project线程 |
增长、删除、重命名字段 |
$match | 条件匹配。只知足条件的文档才能进入下一阶段 |
$limit | 限制结果的数量 |
$skip | 跳过文档的数量 |
$sort | 条件排序。 |
$group | 条件组合结果 |
$unwind | 将array类型字段拆分红多条文档 |
SQL和NOSQL对比:对象
WHERE | $match |
GROUP BY | $group |
HAVING | $match |
SELECT | $project |
ORDER BY | $sort |
LIMIT | $limit |
SUM() | $sum |
COUNT() | $sum |
join | $lookup |
管道表达式:
管道操做符做为“键”,所对应的“值”叫作管道表达式。
例如{$match:{status:"A"}},$match称为管道操做符,而status:"A"称为管道表达式,是管道操做符的操做数(Operand)。
每一个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操做符组成的。排序
经常使用表达式操做符 | Description |
$addToSet | 将文档指定字段的值去重 |
$max | 文档指定字段的最大值 |
$min | 文档指定字段的最小值 |
$sum | 文档指定字段求和 |
$avg | 文档指定字段求平均 |
$gt | 大于给定值 |
$lt | 小于给定值 |
$eq | 等于给定值 |
关于$lookupip
MongoDB 的核心分析工具是 aggregation,经过这个,你能建立一个任务管道(pipeline),对选中的文档施加各类操做,最后获得须要的数据。当你要聚合订单表时,首先在 pipeline 中添加个运算符,来匹配特定的几类产品的订单,而后用另外一个运算符分组计算每类产品的销量。问题是 pipeline 只能对一个集合中的文档进行操做,所以,若是还须要操做另外一个集合的时候,就玩不转了。MongoDB 3.2添加了一个 $lookup 操做符 用以引入其它集合的数据。文档
$lookup 操做符有一个 from 参数,用来指定你想从哪一个集合拖数据。还有一个 on 参数用来指定另外一个集合中的哪一个字段跟 pipeline 中的哪一个字段应该匹配。最后当匹配到一个文档,该文档会被插入管道中的文档,经过 as 参数设定一个 key 把该文档就放到这个 key 中。这个方式看上去有点暴力, 使文档变得很大, 别担忧,其它的聚合操做符会把数据切小的。 $lookup 在聚合管道中有巨大的潜力,可使用户不须要刻意将数据非正规化。不过咱们要等到 alpha/beta 发布才能知道 $lookup 在实践中到底有多有效。 get