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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容