mongodb聚合操作之Aggregation Pipeline

1.?Aggregation Pipeline簡介

?

聚合功能可以把數(shù)據(jù)像 放入傳送帶一樣,先把原始數(shù)據(jù)按照一定的規(guī)則進(jìn)行篩選處理,然后通過多個不同的數(shù)據(jù)處理階處理數(shù)據(jù),最終輸出一個匯總的結(jié)果

?

Pipeline 是什么呢?英文直譯為“管道”,可以形象的比喻為,將原始數(shù)據(jù)經(jīng)過多條“管道”進(jìn)行聚合處理,然后經(jīng)過最后一道管道進(jìn)行聚合處理以后,將聚合結(jié)果返回;其中每一個“管道”的處理流程,在官方文檔中有一個術(shù)語,叫做Pipeline Stage,既是每一個 pipeline 階段;MongoDB 為每一個 pipeline stage 提供了一系列的 operators 操作來完成聚合處理操作;

使用 MongoDB Pipeline 的優(yōu)勢是,MongoDB 提供了許多內(nèi)置的( native )的方法( 就是指這些 operators )來幫助高效的進(jìn)行數(shù)據(jù)的聚合處理;

Aggregation Pipeline 可以在分片集群上進(jìn)行處理;

?

以下是官網(wǎng)的一個演示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 的執(zhí)行過程由一系列的 Aggregation Stages 組成

每一個 Stages 又可以包含多個 Pipeline Expressions 來為每個文檔進(jìn)行更深入的操作;該部分又分為兩個部分,

常規(guī)的 expressions

accumulator expressions

2.?mongodb aggregate操作

?

說明:

計算集合中的數(shù)據(jù)的聚合值。

?

語法:

db.collection.aggregate(pipeline, options)

?

參數(shù)講解:

pipeline:數(shù)組(Array)數(shù)據(jù)聚合操作或階段的序列。有關(guān)詳細(xì)信息,請參閱聚合管道操作符

options:可選的。aggregate()傳遞給aggregate命令的其他選項。僅當(dāng)您將管道指定為數(shù)組時可用。選項可以包含以下字段和值:

?

2.1.?aggregate options參數(shù)

2.1.1.?explain

?

boolean類型,可選的。指定返回關(guān)于管道處理的信息。有關(guān)示例,請參見聚合管道操作的返回信息,在多文檔事務(wù)中不可用。示例: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類型,可選的。允許寫入臨時文件。當(dāng)設(shè)置為true時,聚合操作可以將數(shù)據(jù)寫入dbPath目錄中的_tmp子目錄。有關(guān)示例,請參見使用外部排序執(zhí)行大型排序操作。從MongoDB 4.2開始,如果任何聚合階段由于內(nèi)存限制而將數(shù)據(jù)寫到臨時文件,則分析器日志消息和診斷日志消息包括一個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

?

可選的。指定游標(biāo)的初始批處理大小。游標(biāo)字段的值是一個字段batchSize的文檔。有關(guān)語法和示例,請參見指定初始批處理大小。示例:cursor: { batchSize: <int> }

2.1.4.?maxTimeMs

?

可選的。指定處理游標(biāo)操作的時間限制(以毫秒為單位)。如果沒有為maxTimeMS指定值,操作將不會超時。值0顯式指定默認(rèn)的無限制行為。MongoDB使用與db.killOp()相同的機(jī)制終止超過分配時間限制的操作。MongoDB只在一個指定的中斷點終止一個操作。

2.1.5.?bypassDocumentValidation

?

可選的。僅當(dāng)指定$out或$merge聚合階段時才適用。使db.collection.aggregate以繞過操作期間的文檔驗證。這允許插入不滿足驗證要求的文檔。

2.1.6.?readConcern

?

可選的。指定讀取關(guān)系。

2.1.7.?collation

?

可選的。指定操作要使用的排序規(guī)則。

2.1.8.?hint

?

可選的。用于聚合的索引。索引位于對其運行聚合的初始集合/視圖上。通過索引名稱或索引規(guī)范文檔指定索引。

2.1.9.?comment

?

可選的。用戶可以指定任意字符串來幫助通過數(shù)據(jù)庫分析器、currentOp和日志跟蹤操作。通過索引名稱或索引規(guī)范文檔指定索引。

2.1.10.?writeConcern

?

可選的。表示要與$out或$merge階段一起使用的寫關(guān)注點的文檔。通過索引名稱或索引規(guī)范文檔指定索引。忽略對$out或$merge階段使用默認(rèn)的寫入關(guān)注。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容