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: }

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阶段使用默认的写入关注。

你可能感兴趣的:(mongodb聚合操作之Aggregation Pipeline)