MongoDB Aggregation

對(duì)數(shù)據(jù)進(jìn)行聚合操作,然后將計(jì)算之后的數(shù)據(jù)返回。聚合操作將多個(gè)文檔的值組合在依賴,并且可以對(duì)分組數(shù)據(jù)執(zhí)行各種操作返回單個(gè)結(jié)果。
MongoDB提供三種方式來執(zhí)行聚合操作:aggregation pipeline、map-reduce function、single purpose aggregation methods。

1.Aggregation Pipeline

MongoDB 聚合操作是在數(shù)據(jù)處理管道的邏輯上建模的。documents可以進(jìn)入一個(gè)用于處理docuemnt然后返回聚合值的多階段管道。

底層的管道提供了filters(類似于查詢的操作)和document transformations(修改document的輸出形式)操作。

其他管道操作為document指定具體的屬性或者多個(gè)屬性進(jìn)行分組和排序,以及用array內(nèi)容的聚合工具一樣。管道的階段可以使用運(yùn)算符執(zhí)行任務(wù)。

管道使用MongoDB自帶的本地操作來執(zhí)行聚合操作更高效,管道是MongoDB執(zhí)行聚合操作的首先。

聚合管道可以操作分片collection。聚合管道可以通過使用索引來提高性能。聚合管道內(nèi)部會(huì)進(jìn)行優(yōu)化階段。

1.1 Aggregation Pipeline Optimization

可以使用db.collection.aggregate()的explain參數(shù)看到執(zhí)行計(jì)劃。

1.1.1 Projection Optimization

聚合管道來決定需要返回的字段。如果使用只需要的字段,這樣可以減少數(shù)據(jù)量。

1.1.2 Pipeline Sequence Optimization

project /addFields + match 順序優(yōu)化:將match放入到project /addFields之前(如果是match依賴于project / $addFields的結(jié)果,就不能移動(dòng)),減少數(shù)據(jù)量。

sort +match: 先執(zhí)行$match來減少數(shù)據(jù)量,然后在執(zhí)行排序操作。

redact +match: 如果在前面添加$match操作,可以使用索引來減少數(shù)據(jù)操作。

project +skip(在3.2開始可以使用):將skip操作放到project操作之前,可以減少數(shù)據(jù)量。

1.1.3 Pipeline Coalescence Optimization

通常情況下,在重新排序優(yōu)化之后才會(huì)發(fā)生階段合并。

sort +limit:如果不能減少數(shù)據(jù)量,不會(huì)將這兩個(gè)階段合并。否則先進(jìn)行排序,然后獲取指定的數(shù)量,放入內(nèi)存。如果在中間含有$skip操作,將其放入最后。
在數(shù)據(jù)量超過內(nèi)存限制,這個(gè)操作需要設(shè)置 allowDiskUse=true。

1.2.Aggregation Pipeline Limits

1.2.1 Result Size Restrictions

從MongoDB3.6開始,刪除了aggregate的選項(xiàng),將結(jié)果作為一條數(shù)據(jù)的返回。

aggregate可以返回cursor或者數(shù)據(jù)結(jié)果集。在返回的結(jié)果中,每個(gè)document的大小不能超過16M(這個(gè)限制只針對(duì)返回的document)。
documents有可能會(huì)超過這個(gè)限制,db.collection.aggregate()默認(rèn)返回cursor。

1.2.2 Memory Restrictions

從MongoDB2.6開始,管道階段的RAM限制為100M。如果超過限制,出錯(cuò)。如果為了處理大量的數(shù)據(jù)集,使用allowDiskUse選項(xiàng)開啟管道階段的聚合操作將數(shù)據(jù)寫入到臨時(shí)文件。

從MongoDB3.4之后,graphLookup階段收到內(nèi)存100M的限制。如果在聚合操作allowDiskUse=true,graphLookup操作會(huì)忽略這個(gè)選項(xiàng)。如果其他階段有aggregate()操作,allowDiskUse=true將會(huì)影響這些階段。

1.3.Aggregation Pipeline and Sharded Collections

1.3.1 Behavior

從MongoDB3.2開始,如果按照分片來匹配值,只會(huì)在這個(gè)分片內(nèi)進(jìn)行計(jì)算。

聚合操作在多個(gè)分片上執(zhí)行操作,如果沒有指定主分片,這些操作會(huì)被路由到其他分片上,來減少主分片的負(fù)載。

out和lookup階段需要在主分片上執(zhí)行查詢。

1.3.2 Optimization

將聚合管道拆分為兩部分,這是為了在分片上執(zhí)行優(yōu)化。

操作可以參考實(shí)例

2. MapReduce

2.1 Map-Reduce and Sharded Collections

MapReduce可以在分片上執(zhí)行操作,分片集合可以作為輸入或者輸出。

2.1.1 Sharded Collection as Input

使用分片集合作為MapReduce輸入源,mongos將作業(yè)并行派發(fā)到各個(gè)分片。mongos會(huì)等待所有的作業(yè)完成。

2.1.2 Sharded Collection as Output

如果MapReduce的out字段有分片值,MongoDB使用_id字段作為分片的依據(jù)。

作為一個(gè)分片集合輸出:

  • 如果輸出集合不存在,MongoDB按照_id屬性來創(chuàng)建和分片集合。
  • 從4.0開始之后,如果輸出集合存在但是沒有分片,mapreduce就會(huì)失敗。
  • 對(duì)于新的分片集合或者空的分片集合,MongoDB使用第一個(gè)階段的結(jié)果來創(chuàng)建分片中初始分片塊。
  • mongo并行分發(fā)作業(yè)到每一個(gè)分片上。
  • 在MapReduce執(zhí)行任務(wù)時(shí),MongoDB會(huì)刪除數(shù)據(jù)塊。在后處理期間會(huì)自動(dòng)阻止對(duì)輸出集合的塊進(jìn)行平衡,以避免并發(fā)問題。

2.2 Map-Reduce Concurrency

在操作的過程中,mapreduce有很多鎖:

  • 讀階段采用讀鎖定。每100個(gè)document產(chǎn)生一個(gè)讀鎖。
  • 在寫階段,每一個(gè)document擁有一個(gè)寫鎖。
  • 如果輸出集合不存在,創(chuàng)建輸出集合會(huì)獲取一個(gè)寫鎖。
  • 如果輸出集合存在,輸出動(dòng)作會(huì)獲取一個(gè)寫鎖。這個(gè)鎖是全局的,鎖定mongodb實(shí)例所有的操作。

相關(guān)練習(xí)教程

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

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

  • Aggregation 聚合(aggregate)指令可以操作一個(gè)集合中的文檔,將統(tǒng)計(jì)或處理部分的域, 再經(jīng)過加工...
    我看不見閱讀 1,301評(píng)論 0 0
  • MongoDB聚合操作用于對(duì)數(shù)據(jù)的批量操作,將集合按條件分組后在進(jìn)行一系列操作,諸如求和、求均值等。聚合操作能對(duì)集...
    JunChow520閱讀 4,045評(píng)論 0 0
  • MongoDB Aggregation 最近在做產(chǎn)品的后臺(tái)管理時(shí),查詢的數(shù)據(jù)量比較大時(shí),MongoDB會(huì)報(bào)錯(cuò),由于...
    CoderMiner閱讀 2,232評(píng)論 0 0
  • 聚合操作處理數(shù)據(jù)記錄并返回計(jì)算結(jié)果。聚合操作組將來自多個(gè)文檔的值組合在一起,并且可以對(duì)分組數(shù)據(jù)執(zhí)行各種操作以返回單...
    yuanzicheng閱讀 947評(píng)論 0 50
  • MongoDB的聚合操作主要是對(duì)數(shù)據(jù)的批量處理。一般都是將記錄按條件分組之后進(jìn)行一系列求最大值,最小值,平均值的簡(jiǎn)...
    AaronSimon閱讀 2,528評(píng)論 0 6

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