MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。

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

MongoDB提供了三种执行聚合的方法:

  • aggregation pipeline
  • map-reduce 函数
  • 单一目的聚合方法

Aggregation Pipeline

MongoDB 的聚合框架以数据处理管道的概念为模型。文档进入多阶段流水线,将文档转换成汇总结果。例如: agg-pipeline.mp4 (4.41MB) 在这个示例中:

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

第一阶段:$match 阶段按字段过滤文档,并将具有等于 .statusstatus"A" 的那些文档传递到下一阶段
第二阶段:$group 阶段按字段将文档分组,以计算每个唯一 .cust_idcust_id 金额的总和

最基本的管道阶段提供过滤器,其操作类似于查询和修改输出文档形式的文档转换。

其他管道操作提供了用于按特定字段对文档进行分组和排序的工具,以及用于汇总数组(包括文档数组)内容的工具。另外,管道阶段可以将运算符用于诸如计算平均值或连接字符串之类的任务。

管道使用MongoDB中的本机操作提供有效的数据聚合,并且是MongoDB中数据聚合的首选方法。

聚合管道可以对分片集合进行操作。

聚合管道可以在某些阶段使用索引来提高其性能。另外,聚合管道具有内部优化阶段。有关详细信息,请参见管道运算符和索引以及聚集管道优化。

Map-Reduce

MongoDB 还提供了 map-reduce 操作来执行聚合。Map-reduce 使用自定义 JavaScript 函数来执行映射和归约操作以及可选的 finalize 操作。
聚合 - 图2

单一目的聚合操作

MongoDB 还提供了 [db.collection.estimatedDocumentCount()](https://docs.mongodb.com/manual/reference/method/db.collection.estimatedDocumentCount/#db.collection.estimatedDocumentCount), [db.collection.count()](https://docs.mongodb.com/manual/reference/method/db.collection.count/#db.collection.count)[db.collection.distinct()](https://docs.mongodb.com/manual/reference/method/db.collection.distinct/#db.collection.distinct)

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