聚合管道(Aggregation Pipeline)
定义
聚合管道是MongoDB提供的一种数据统计框架。通过Aggregation操作,能够实现类似于SQL 中Group By操作的功能。
由于之前MongoDB中实现聚合操作需使用相对复杂的MapReduce,而聚合管道拥有固定的操作符表达, 使用更为简单。因此,聚合管道能够成为MapReduce的一种替代方案。
工作方式
聚合管道由多个节点组成,这些节点用管道操作符来进行表示。每个节点有自己特殊的功能(分组、过滤等)。
文档从一个操作节点 流向下一个节点 ,每个操作节点对文档做相应的操作,最后输出相应的结果。
功能
管道基本的功能有两个:一是对文档进行“过滤”,也就是筛选出符合条件的文档;二是对文档进行“变换”,也就是改变文档的输出形式。
其他的一些功能还包括按照某个指定的字段分组和排序等。而且在每个阶段还可以使用表达式操作符计算平均和拼接字符串等相关操作
聚合框架操作符(Aggregation Framework Operator)
管道操作符
| 管道操作符 | Description |
|---|---|
| $projection | 增加、删除、重命名字段 |
| $match | 按条件匹配。只有满足条件的文档才能进入下一阶段 |
| $limit | 限制结果的数量 |
| $skip | 跳过文档的数量 |
| $sort | 按条件排序。 |
| $group | 按条件组合结果 |
| $unwind | 将array类型字段拆分成多条文档 |
管道表达式
管道操作符作为“键”,所对应的“值”叫做管道表达式。
例如{$match:{status:"A"}},$match称为管道操作符,而status:"A"称为管道表达式,是管道操作符的操作数(Operand)。
每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的。
| 常用表达式操作符 | Description |
|---|---|
| $addToSet | 将文档指定字段的值去重 |
| $max | 文档指定字段的最大值 |
| $min | 文档指定字段的最小值 |
| $sum | 文档指定字段求和 |
| $avg | 文档指定字段求平均 |
| $gt | 大于给定值 |
| $lt | 小于给定值 |
| $eq | 等于给定值 |
更详尽的内容,可以参见MongoDB官方文档
Aggregation的使用
任务:某游戏(gkey)的忠诚用户用户(即某周登陆N天以上)数量。cnt字段表示用户登陆次数。
php代码
$match = array('$match'=>array( 'cnt' =>array('$gt'=>($this->data['loginTimes'])),
'year' =>(int)$YMD['year'],
'month' =>(int)$YMD['month'],
'day' =>(int)$YMD['day']));
$group = array('$group'=>array( "_id" =>array("gkey"=>'$gkey'),
"count" =>array('$sum'=>1)));
$newPlayers = $collection->aggregate(array($match, $group));
解释:$match指定过滤条件。'cnt'=>array('$gt'=>$this->data['loginTimes']表示登陆次数应大于指定次数。'year'=>$YMD['year']等表示文档的时间字段必须与指定的一致。
$group指定组合条件。将满足$match条件且gkey相同的文档组合在一起。"count"=>array('$sum'=>1)表示将count字段的值设为gkey相同文档的数量。
注意事项:
- aggregate中对管道操作符按顺序执行,即可以先group,再对group的结果match。(流水线)
- $match尽量出现在管道的前面,这样可以提早过滤文档,加快聚合速度
- $group的时候必须要指定一个_id域
- 尽早使用$project投影,去掉不用的字段,可以大大减少内存
聚合框架的限制
类型限制
在管道内不能操作 Symbol, MinKey, MaxKey, DBRef, Code, CodeWScope类型的数据
结果大小限制
管道线的输出结果不能超过BSON 文档的大小(16M),如果超出的话会产生错误。
内存限制
如果一个管道操作符在执行的过程中所占内存超过系统内存容量的10%的时候,会产生一个错误。
当$sort和$group操作符执行的时候,整个输入都会被加载到内存中,如果这些占有内存超过系统内存的%5的时候,会将一个warning记录到日志文件。
MongoDB的聚合管道提供了一种数据统计框架,类似SQL的Group By操作。通过Aggregation,可以简化原本复杂的MapReduce操作。聚合管道由多个节点组成,每个节点执行特定功能,如过滤和变换文档。它支持分组、排序、表达式计算等功能,并在实际应用中,如统计游戏的忠诚用户数量,表现出高效和灵活性。但聚合操作也有限制,包括类型限制、结果大小限制和内存限制。
1224

被折叠的 条评论
为什么被折叠?



