1. 程式人生 > >Mongodb中資料聚合之聚合管道aggregate

Mongodb中資料聚合之聚合管道aggregate

面對著廣大使用者對資料統計的需求,Mongodb從2.2版本之後便引入了新的功能聚合框架(aggregation framework),它是資料聚合的新框架,這個概念類似於資料處理中的管道。每個文件通過一個由多個節點組成的管道,每個節點都有自己的特殊的作用(分組、過濾等),文件經過由多個節點組成的管道後最終得到輸出結果。管道基本的功能有兩種:(1)對文件進行過濾,篩選出符合條件的文件;(2)對文件進行變換,改變文件的輸出結構。

聚合管道的使用方式:db.collection.aggregate();

對於管道中的多個節點可以使用以下幾種管道操作符,下面對各種管道操作符的功能進行描述:

$project:修改文件的結構(重新命名、增加或刪除域),也可以用於建立計算結果以及巢狀文件。
$match:過濾資料,只輸出符合條件的文件。
$limit:限制MongoDB聚合管道返回的文件數。
$skip:在聚合管道中跳過指定數量的文件。
$unwind:將文件中的某一個數組型別欄位拆分成多條,每條包含陣列中的一個值。
$group:將集合中的文件分組,可用於統計結果。
$sort:文件排序輸出。
$geoNear:輸出接近某一地理位置的有序文件。

舉兩個簡單的例子:

db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );

db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: user, count: { $sum: 1 } } }
                       ] );

下面對聚合管道使用過程中需要注意的地方進行說明:

(1)管道的是具有先後順序的。
(2)$group操作目前是在記憶體中處理的,因此,不能對大量的文件進行使用該種方式進行分組操作;
(3)使用$unwind對陣列中的欄位值進行拆分時需要注意不能忘記寫$符號,如{$unwind:"$tags"},tags欄位前面有個$號;
(4)MongoDB 24.對記憶體做了優化,如果$sort出現在$limit之前,$sort只會對前$limit個文件進行操作,在記憶體中也只會保留前$limit個文件,節省了記憶體
(5)$sort操作是在記憶體中進行的,如果其佔有的記憶體超過實體記憶體的10%,程式會產生錯誤

(6)管道的輸出結果大小不能大於16M,超過會出現錯誤。
(7)如果一個管道操作符在執行過程中所佔用的記憶體超過系統記憶體容量的10%,則會報錯;
(8)聚合管道可以提供很好的效能和一致的介面,使用起來比較簡單,對於一些簡單的固定的聚集操作可以使用管道,但是對於一些複雜的、大量資料集的聚合任務還是使用MapReduce。

至此,關於Mongodb資料庫內的資料聚合操作的簡單描述便結束了,如果大家想更深入的學習瞭解,我覺得官網才是最好的教材,奮鬥