MongoDB 聚合(aggregate)

MongoDB中聚合(aggregate)操作处理数据记录并返回计算结果,聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回结果。

先看一张图我们可以看出整个聚合的过程(图片来自mongodb官方)

db.collection.aggregate()的定义

db.collection.aggregate(pipelineoptions)

pipelinearray在版本2.6中更改:该方法仍然可以接受管道阶段作为独立的参数,而不是数组中的元素;如果不将管道指定为数组,则不能指定options参数。
optionsdocument可选的 只有在将管道指定为数组时才可用。

 

options选项文档可以包含以下字段和值

explainboolean可选。指定返回关于管道处理的信息
allowDiskUseboolean可选。允许写入临时文件。当设置为true时,聚合操作可以将数据写入dbPath目录中的_tmp子目录
cursordocument

可选。指定游标的初始批处理大小。该cursor 字段的值是具有该字段的文档batchSize

maxTimeMS非负整数

可选。指定处理游标操作的时间限制(以毫秒为单位)。如果未指定maxTimeMS的值,则操作不会超时。值0显式指定默认的无界行为。

MongoDB使用与之相同的机制终止超出其分配时间限制的操作db.killOp()。MongoDB仅终止其指定中断点之一的操作。

bypassDocumentValidationboolean可选。只有在指定$out聚合操作符时才可用。
使db.collection。聚合以在操作期间绕过文档验证。这样可以插入不满足验证要求的文档。
readConcerndocument

可选的。指定读取问题

readConcern选项具有以下语法:

readConcern: { level: <value> }
collationdocument

可选。

指定 要用于操作的排序规则

排序规则允许用户为字符串比较指定特定于语言的规则,例如字母和重音标记的规则。

排序规则选项具有以下语法:

collation: {
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}

指定排序规则时,该locale字段是必填字段; 所有其他校对字段都是可选的。有关字段的说明,请参阅排序文档

如果未指定排序规则但集合具有默认排序规则(请参阅参考资料db.createCollection()),则该操作将使用为集合指定的排序规则。

如果没有为集合或操作指定排序规则,MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。

您无法为操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果使用排序执行查找,则不能对查找使用一个排序规则,而对排序使用另一个排序规则。

hintstring or document

可选。用于聚合的索引。索引位于运行聚合的初始集合/视图上。

通过索引名称或索引规范文档指定索引。

注意

hint不适$lookup和 $graphLookup阶段。

 

commentstring

可选。用户可以指定任意字符串,以帮助通过数据库事件探查器,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相关技术栈分享 交流 学习

 

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值