MongoDB中聚合(aggregate)操作处理数据记录并返回计算结果,聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回结果。
先看一张图我们可以看出整个聚合的过程(图片来自mongodb官方)
db.collection.aggregate()的定义
db.collection.
aggregate
(pipeline, options)
pipeline | array | 在版本2.6中更改:该方法仍然可以接受管道阶段作为独立的参数,而不是数组中的元素;如果不将管道指定为数组,则不能指定options参数。 |
options | document | 可选的 只有在将管道指定为数组时才可用。 |
options选项文档可以包含以下字段和值
explain | boolean | 可选。指定返回关于管道处理的信息 |
allowDiskUse | boolean | 可选。允许写入临时文件。当设置为true时,聚合操作可以将数据写入dbPath目录中的_tmp子目录 |
cursor | document | 可选。指定游标的初始批处理大小。该 |
maxTimeMS | 非负整数 | 可选。指定处理游标操作的时间限制(以毫秒为单位)。如果未指定maxTimeMS的值,则操作不会超时。值 MongoDB使用与之相同的机制终止超出其分配时间限制的操作 |
bypassDocumentValidation | boolean | 可选。只有在指定$out聚合操作符时才可用。 使db.collection。聚合以在操作期间绕过文档验证。这样可以插入不满足验证要求的文档。 |
readConcern | document | 可选的。指定读取问题。 readConcern选项具有以下语法:
|
collation | document | 可选。 指定 要用于操作的排序规则。 排序规则允许用户为字符串比较指定特定于语言的规则,例如字母和重音标记的规则。 排序规则选项具有以下语法: 指定排序规则时,该 如果未指定排序规则但集合具有默认排序规则(请参阅参考资料 如果没有为集合或操作指定排序规则,MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。 您无法为操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果使用排序执行查找,则不能对查找使用一个排序规则,而对排序使用另一个排序规则。 |
hint | string or document | 可选。用于聚合的索引。索引位于运行聚合的初始集合/视图上。 通过索引名称或索引规范文档指定索引。 注意 该
|
comment | string | 可选。用户可以指定任意字符串,以帮助通过数据库事件探查器,currentOp和日志跟踪操作。 |
下面例子说明mongodb聚合的语法使用和场景
先导入一些测试数据 订单详情
{ _id: 1, cust_id: "abc1", ord_date: ISODate("2012-11-02T17:04:11.102Z"), status: "A", amount: 50 }
{ _id: 2, cust_id: "xyz1", ord_date: ISODate("2013-10-01T17:04:11.102Z"), status: "A", amount: 100 }
{ _id: 3, cust_id: "xyz1", ord_date: ISODate("2013-10-12T17:04:11.102Z"), status: "D", amount: 25 }
{ _id: 4, cust_id: "xyz1", ord_date: ISODate("2013-10-11T17:04:11.102Z"), status: "D", amount: 125 }
{ _id: 5, cust_id: "abc1", ord_date: ISODate("2013-11-12T17:04:11.102Z"), status: "A", amount: 25 }
1.选择状态为“A”的文档,按照cust_id字段分组匹配文档,
从amount字段的和中计算每个cust_id字段的total,
按照total字段的降序排序结果
我们可以看到在语句中也是按照顺序向下执行 $match 选择状态为“A”的文档 $group 按照cust_id字段分组匹配文档,从amount字段的和中计算每个cust_id字段的total $sort 按照total字段的降序排序结果 其实类似与管道的概念
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
2.根据mongodb聚合操作将explain设置为true,以返回关于聚合操作的信息。
该操作返回一个带有文档的游标,该文档包含有关聚合管道处理的详细信息
3.展示了一些聚合的表达式 用于统计运算 实例里面说明了一些基本的使用语法
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在结果文档中插入值到一个数组中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
本篇主要讲解了一些聚合的定义 pipeline参数和options参数一些基本使用 后续将描述复杂统计分析的场景应用
如果写的对你有一点点帮助的话,就随便帮下小明同学 感谢大伙 !!!
一、 左下角点个赞再走吧,给博主一点关怀,可以让更多人看到
二、可以关注我的微信公众号「一起学Node」基于前后端NodeJs相关技术栈分享 交流 学习