mongodb聚合管道由多個階段組成。每個階段在文件通過管道時轉換文件。管道階段不需要為每個輸入文件生成乙個輸出文件;例如,有些階段可能會生成新的文件或過濾掉文件。
管道階段可以在管道**現多次,但$out
、$merge
和$geonear
階段除外。有關所有可用階段的列表,請參見聚合管道階段。
mongodb在mongo shell中提供db.collection.aggregate()方法和用於執行聚合管道的聚合命令。
從mongodb 4.2開始,你可以使用聚合管道更新:
命令mongo shell的方法
findandmodify
db.collection.findoneandupdate()
db.collection.findandmodify()
update
db.collection.updateone()
db.collection.updatemany()
db.collection.update()
bulk.find.update()
bulk.find.updateone()
bulk.find.upsert()
有些管道階段採用管道表示式作為運算元。管道表示式指定應用於輸入文件的轉換。表示式具有文件結構,可以包含其他表示式。
管道表示式只能對管道中的當前文件進行操作,不能引用其他文件中的資料:表示式操作提供了文件在記憶體中的轉換。
通常,表示式是無狀態的,只有在聚合過程看到表示式時才會計算,只有乙個例外:累加器表示式。
在$group
階段中使用的累加器在記錄管道中的程序時維護它們的狀態(例如總數、最大值、最小值和相關資料)。
3.2版本的變化:一些累加器在$project
階段可用;但是,在$project
階段使用時,累加器不會跨文件維護它們的狀態。
有關表示式的更多資訊,請參見表示式。
在mongodb中,聚合命令對單個集合進行操作,在邏輯上將整個集合傳遞到聚合管道中。為了優化操作,盡可能使用以下策略來避免掃瞄整個集合。
mongodb的查詢規劃器通過分析聚合管道來確定是否可以使用索引來提高管道效能。例如,下面的管道階段可以利用索引:
下面的管道階段並不是可以使用索引的所有階段的完整列表。3.2版本中的變化:從mongodb 3.2開始,索引可以覆蓋聚合管道。在mongodb 2.6和3.0中,索引不能覆蓋聚合管道,因為即使管道使用索引,聚合仍然需要訪問實際的文件。
如果聚合操作只需要集合中資料的乙個子集,則使用$match
、$limit
和$skip
階段來限制在管道開頭輸入的文件。當放在管道的開頭時,$match操作使用合適的索引只掃瞄集合中匹配的文件。
在管道開始處放置乙個$match
管道階段和乙個$sort
階段,在邏輯上等同於乙個帶有排序的查詢,並且可以使用索引。如果可能,在管道的開頭放置$match
操作符。
聚合管道支援對分片集合的操作。請參閱聚合管道和分片集合。
聚合管道為map-reduce提供了一種替代方案,並且對於map-reduce的複雜性可能沒有保障的聚合任務,它可能是首選的解決方案。
聚合管道對值型別和結果大小有一些限制。有關聚合管道的限制和限制的詳細資訊,請參見聚合管道限制。
聚合管道有乙個內部優化階段,為某些操作符序列提供改進的效能。有關詳細資訊,請參見聚合管道優化。
MongoDB管道聚合各階段
管道聚合各階段 名稱 描述 project 改造流中的文件,像通過增加新的字段或移除存在的字段。對於每乙個輸入文件,輸出乙個文件。match 過濾文件流,只允許匹配的文件不經過修改進入到下乙個管道階段。match使用標準的mongodb查詢。對於每個輸入文件,輸出要麼乙個文件 匹配乙個 要麼零個文件...
MongoDB 聚合 游標
今天跟大家分享一下mongodb中比較好玩的知識,主要包括 聚合,游標。一 聚合 常見的聚合操作跟sql server一樣,有 count,distinct,group,mapreduce。1 count count是最簡單,最容易,也是最常用的聚合工具,它的使用跟我們c 裡面的count使用簡直一...
MongoDB 聚集管道
在mongodb2.2新出現的。聚集管道式基於資料處理管道概念建模的資料聚集框架。文件進入乙個多階段能將該文件轉化為聚集結果的管道。聚集管道提供了map reduce方法了替代物,並在很多聚集任務中是首選的方案,因為map reduce的複雜性可能是你不希望看到的。上圖是乙個帶注釋的聚集管道的操作,...