MongoDB 聚集管道

2021-12-29 21:37:47 字數 2052 閱讀 9168

在mongodb2.2新出現的。

聚集管道式基於資料處理管道概念建模的資料聚集框架。文件進入乙個多階段能將該文件轉化為聚集結果的管道。

聚集管道提供了map-reduce方法了替代物,並在很多聚集任務中是首選的方案,因為map-reduce的複雜性可能是你不希望看到的。

上圖是乙個帶注釋的聚集管道的操作,有兩個階段:$match和$group

聚集管道在值的型別和結果大小上有很多限制。下面簡單介紹,

聚集操作在使用aggregate命令時有的限制:

型別限制

聚集管道不是在下列型別的值上進行操作:symbol,minkey,maxkey,dbref,code和codewsrope

(在mongodb2.4版本解除了對binary型別的限制。在mongodb2.2,管道不能對binary型別資料操作)

結果大小限制

如果aggregate命令返回的單個文件保護完整的結果集,則該命令在結果集超過bson document size限制時會產生乙個錯誤,目前的大小是16m。為了管理超過這一限制的結果集,aggregate命令當命令返回乙個游標(cursor)或把結果儲存在乙個collection裡時,能夠返回任意大小的結果集。

(在mongodb2.6,aggregate命令返回乙個游標或把結果存在乙個collection時,能不受這個大小限制。db.collection.aggregate()返回乙個游標,能返回任意大小的結果集。)

記憶體限制

在mongodb2.6有了變化。

管道階段在ram有100m的限制。如果超過這一限制,mongodb會出錯。為了允許操作大型資料,可以使用allowdiskuse選項來時聚集管道階段能往臨時檔案寫資料。

管道

管道,顧名思義就是來自集合的文件通過乙個聚集管道的旅行,當通過其中時該管道能轉化這些物件。對熟悉unix shells命令的(如 bash),這個概念和管道(pipe)很類似。

mongodb的聚集管道以乙個集合的文件開始,流動文件從乙個管道操作(pipeline operator)到下乙個來處理文件。在管道的每乙個操作符在文件經過管道時都會轉化文件。管道操作符不需要為每乙個輸入文件產生乙個輸出文件。操作符可以產生新文件也能過濾文件。管道操作能在乙個管道裡面重複。

管道表示式

每乙個管道操作符接受乙個管道表示式作為運算元。管道表示式指出應用在輸入文件的轉化過程。表示式有乙個文件(document)結構,幷包含字段,值和操作符。

管道表示式只能操作在管道中的當前文件,不能引用在其他文件的資料:表示式提供了記憶體(in-memory)文件轉化。

一般的,表示式是無狀態的,只在聚集過程時有乙個例外:accumulation expressions。累加表示式,使用$group管道,維持他們的狀態(如,totals,maximums,mininums和相關資料)作為通過管道的文件過程。

聚集管道行為

在mongodb,aggregate命令操作單個集合,並在邏輯上傳遞整個文件給聚集管道。為了優化這個操作,在可能的情況下,應該使用下面策略來避免掃瞄整個集合。

管道操作符和索引

$match和$sort管道操作符能夠利用索引的優勢,如果他們在管道的開始位置出現。

(在mongo2.4新出現的:$geonear管道操作符能利用地理索引的優勢。當使用$geonear,$geonear必須在聚集管道的第一階段出現。)

即使管道使用了索引,聚合操作依然要訪問實際的文件。比如,索引不能完全覆蓋聚集管道。

(在mongo2.6之前的版本,對規模非常小的選擇情況,索引能夠覆蓋管道)

提前過濾

如果你的聚集應用僅需要乙個集合的乙個資料子集,使用 $match,$limit,$skip階段在文件進入管道時去限制文件.當被放置在管道的開始,$match操作符使用合適的索引去掃瞄集合匹配的文件.

在管道的開始緊跟著$sort階段放置$match在邏輯上等價於乙個使用排序的單一查詢,並可以使用索引.如果可能的話,把$match放置在管道的開頭.

mongodb 聚合管道

mongodb聚合管道由多個階段組成。每個階段在文件通過管道時轉換文件。管道階段不需要為每個輸入文件生成乙個輸出文件 例如,有些階段可能會生成新的文件或過濾掉文件。管道階段可以在管道 現多次,但 out merge和 geonear階段除外。有關所有可用階段的列表,請參見聚合管道階段。mongodb...

MongoDB 聚集和分組例子

在本文章中,會演示mongodb使用聚集函式對文件進行分組的用法。1.測試資料 主機網域名稱列表的json格式檔案 website.json 匯入website文件 mongoimport d testdb c website file website.json connected to 127.0...

MongoDB聚集索引基本操作

檢視當前聚集的全部索引 db.account.getindexes v 0 建立單列索引 db.account.ensureindex 1 asc 1 desc 建立單列唯一索引 db.account.ensureindex 建立單列唯一不重複索引 db.account.ensureindex 建立...