目录

  • 1 聚合管道
  • 2 Map-Reduce
  • 3 单用途的聚合操作
  • 4 其他特性和行为


聚合操作处理数据记录并返回计算结果。聚合操作将来自多个文档的值组合在一起,并且可以对分组的数据执行各种操作并返回单个结果。MongoDB提供了三种执行聚合的方式:聚合管道,map-reduce函数和单用途的聚合操作方法。

1 聚合管道

MongoDB的聚合框架(aggregation framework)以处理数据的管道(data processing pipelines)的概念为模型。文档进入多阶段管道,该管道将文档转换成汇总结果。例如:

db.orders.aggregate([
   { $match: { status: "A" } },
   { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])

第一阶段: $match阶段按status字段过滤文档,并将status等于"A"的文档传递到下一阶段。
第二阶段: $group阶段按cust_id字段将文档分组,并计算每个cust_id的总和。
最基本的管道阶段提供过滤器,过滤器操作类似于查询和修改输出文档格式的文档转换。

其他管道操作提供了用于按特定字段对文档进行分组和排序的工具,以及用于聚合包括文档数组在内的数组内容的工具。另外,管道阶段可以将运算符用于诸如计算平均值或连接字符串之类的任务。
管道使用MongoDB中的本地操作提供有效的数据聚合,并且是MongoDB中数据聚合的首选方法。
聚合管道可以在操作分片集合
聚合管道可以在某些阶段(stages)使用索引来提高其性能。另外,聚合管道具有内部优化阶段(时期/phase)。有关详细信息,请参见管道运算符和索引以及聚合管道优化

2 Map-Reduce

MongoDB还提供了map-reduce操作来执行聚合。通常,map-reduce操作有两个阶段:处理每个文档并为每个输入文档发出一个或多个对象的map阶段,以及将map操作的输出组合在一起的reduce阶段。还存在一个可选的阶段,map-reduce可以具有一个 finalize阶段来对结果进行最终修改。与其他聚合操作一样,map-reduce可以指定查询条件来选择输入文档以及对结果进行排序和限制。
Map-reduce使用自定义JavaScript函数来执行map和reduce操作以及可选的finalize操作。尽管自定义JavaScript与聚合管道相比提供了极大的灵活性,但总的来说,map-reduce比聚合管道效率低,并且复杂性更高。
Map-reduce可以对分片集合进行操作。Map-reduce操作也可以输出到分片集合。有关详细信息,请参见 Map-Reduce和分片集合

注意
从MongoDB 2.4开始,某些mongo shell功能和属性在map-reduce操作中不可访问。MongoDB 2.4还支持同时运行多个JavaScript操作。在MongoDB 2.4之前,JavaScript代码在单个线程中执行,从而导致了map-reduce的并发问题。

grafana 聚合查询 aggregate聚合_数据

3 单用途的聚合操作

MongoDB也提供db.collection.estimatedDocumentCount()db.collection.count()db.collection.distinct()

所有这些操作都汇总了单个集合中的文档。尽管这些操作提供了对常见聚合过程的简单访问,但是它们缺乏聚合管道和map-reduce的灵活性和功能。

grafana 聚合查询 aggregate聚合_nosql_02

4 其他特性和行为

有关聚合管道,map-reduce和特定组功能的特性比较,请参阅“ 聚合命令比较”。