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

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

python写mongodb的聚合函数 和 求和 求和分开 mongodb聚合性能_group

db.collection.aggregate()的定义

db.collection.aggregate(pipelineoptions)

pipeline

array

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

options

document

可选的 只有在将管道指定为数组时才可用。

 

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

explain

boolean

可选。指定返回关于管道处理的信息

allowDiskUse

boolean

可选。允许写入临时文件。当设置为true时,聚合操作可以将数据写入dbPath目录中的_tmp子目录

cursor

document

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

maxTimeMS

非负整数

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

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

bypassDocumentValidation

boolean

可选。只有在指定$out聚合操作符时才可用。

使db.collection。聚合以在操作期间绕过文档验证。这样可以插入不满足验证要求的文档。

readConcern

document

可选的。指定读取问题。

readConcern选项具有以下语法:

readConcern: { level: <value> }
  • "local"。这是默认的读取关注级别。
  • "available"。当读取操作和afterClusterTime以及“level”未指定时,这是对辅助节点的读取的默认值。查询返回实例的最新数据。
  • "majority"。适用于使用WiredTiger存储引擎的副本集 。
  • "linearizable"。仅适用于读取操作 primary。

collation

document

可选。

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

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

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

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

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

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

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

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

hint

string or document

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

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

注意

该hint不适$lookup和 $graphLookup阶段。

 

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 }

python写mongodb的聚合函数 和 求和 求和分开 mongodb聚合性能_统计_02

 

 

1.选择状态为“A”的文档,按照cust_id字段分组匹配文档,

从amount字段的和中计算每个cust_id字段的total,

按照total字段的降序排序结果

python写mongodb的聚合函数 和 求和 求和分开 mongodb聚合性能_group_03

我们可以看到在语句中也是按照顺序向下执行  $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,以返回关于聚合操作的信息。

python写mongodb的聚合函数 和 求和 求和分开 mongodb聚合性能_mongodb_04

该操作返回一个带有文档的游标,该文档包含有关聚合管道处理的详细信息

 

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参数一些基本使用  后续将描述复杂统计分析的场景应用