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)注。