mongodb聚合操作之Aggregation Pipeline
1. Aggregation Pipeline简介
聚合功能可以把数据像 放入传送带一样,先把原始数据按照一定的规则进行筛选处理,然后通过多个不同的数据处理阶处理数据,最终输出一个汇总的结果
Pipeline 是什么呢?英文直译为“管道”,可以形象的比喻为,将原始数据经过多条“管道”进行聚合处理,然后经过最后一道管道进行聚合处理以后,将聚合结果返回;其中每一个“管道”的处理流程,在官方文档中有一个术语,叫做Pipeline Stage,既是每一个 pipeline 阶段;MongoDB 为每一个 pipeline stage 提供了一系列的 operators 操作来完成聚合处理操作;
使用 MongoDB Pipeline 的优势是,MongoDB 提供了许多内置的( native )的方法( 就是指这些 operators )来帮助高效的进行数据的聚合处理;
Aggregation Pipeline 可以在分片集群上进行处理;
以下是官网的一个演示Aggregation Pipline功能的过程图
启动 Aggregation Pipeline,包含两个部分
通过 db.collection.aggregate() 方法启动
通过 aggregate 命令启动,例如:
db.runCommand( {
aggregate: "articles",
pipeline: [
{ $project: { tags: 1 } },
{ $unwind: "$tags" },
{ $group: { _id: "$tags", count: { $sum : 1 } } }
],
cursor: { }
} )
Pipeline 的执行过程由一系列的 Aggregation Stages 组成
每一个 Stages 又可以包含多个 Pipeline Expressions 来为每个文档进行更深入的操作;该部分又分为两个部分,
常规的 expressions
accumulator expressions
2. mongodb aggregate操作
说明:
计算集合中的数据的聚合值。
语法:
db.collection.aggregate(pipeline, options)
参数讲解:
pipeline:数组(Array)数据聚合操作或阶段的序列。有关详细信息,请参阅聚合管道操作符
options:可选的。aggregate()传递给aggregate命令的其他选项。仅当您将管道指定为数组时可用。选项可以包含以下字段和值:
2.1. aggregate options参数
2.1.1. explain
boolean类型,可选的。指定返回关于管道处理的信息。有关示例,请参见聚合管道操作的返回信息,在多文档事务中不可用。示例:db.orders.explain().aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
])
db.orders.aggregate(
[
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
],
{
explain: true
}
)
2.1.2. allowDiskUse
boolean类型,可选的。允许写入临时文件。当设置为true时,聚合操作可以将数据写入dbPath目录中的_tmp子目录。有关示例,请参见使用外部排序执行大型排序操作。从MongoDB 4.2开始,如果任何聚合阶段由于内存限制而将数据写到临时文件,则分析器日志消息和诊断日志消息包括一个usedDisk指示器。示例:
var results = db.stocks.aggregate(
[
{ $project : { cusip: 1, date: 1, price: 1, _id: 0 } },
{ $sort : { cusip : 1, date: 1 } }
],
{
allowDiskUse: true
}
)
2.1.3. cursor
可选的。指定游标的初始批处理大小。游标字段的值是一个字段batchSize的文档。有关语法和示例,请参见指定初始批处理大小。示例:cursor: { batchSize: <int> }
2.1.4. maxTimeMs
可选的。指定处理游标操作的时间限制(以毫秒为单位)。如果没有为maxTimeMS指定值,操作将不会超时。值0显式指定默认的无限制行为。MongoDB使用与db.killOp()相同的机制终止超过分配时间限制的操作。MongoDB只在一个指定的中断点终止一个操作。
2.1.5. bypassDocumentValidation
可选的。仅当指定$out或$merge聚合阶段时才适用。使db.collection.aggregate以绕过操作期间的文档验证。这允许插入不满足验证要求的文档。
2.1.6. readConcern
可选的。指定读取关系。
2.1.7. collation
可选的。指定操作要使用的排序规则。
2.1.8. hint
可选的。用于聚合的索引。索引位于对其运行聚合的初始集合/视图上。通过索引名称或索引规范文档指定索引。
2.1.9. comment
可选的。用户可以指定任意字符串来帮助通过数据库分析器、currentOp和日志跟踪操作。通过索引名称或索引规范文档指定索引。
2.1.10. writeConcern
可选的。表示要与$out或$merge阶段一起使用的写关注点的文档。通过索引名称或索引规范文档指定索引。忽略对$out或$merge阶段使用默认的写入关注。