MongoDB學習(使用分組、聚合和映射-歸並)


使用分組、聚合和映射-歸並  

  MongoDB的強大功能之一,是直接在服務器對文檔的值進行復雜的操作,而不用先發文檔發送到客戶端在進行處理。

結果分組

  對大型數據集進行查詢操作時,通常會根據文檔的字段值對其進行分組。這可以在取回文檔后通過代碼來完成,但在服務器端查找的同時進行分組效率跟高。

  要將查詢結果分組,可使用Collection對象的方法 group()。該語法為:

db.collection_name.group({key, reduce, initial, [keyf], [cond], finalize})

  參數列表:

  •   key:指定要根據哪些健進行分組。其屬性為要用於分組的字段,值為 1。
  •   reduce:一個接受參數 obj 和 prev 的函數( function(obj,prev))。對於每個與查詢匹配的文檔,都執行這個參數。其中參數 obj 為當前文檔,而 prev 是根據參數 initial 創建的對象。(可以通過obj來更新prev,如計數或累計)。
  •   initial:可以創建一個group分組字段,並包含初始值,用於在分組期間聚合數據。(常見的是使用一個計數器來跟蹤匹配的文檔數。{ initial : {"count" : 0 } } )。
  •   keyf:可選。指定一個函數,這個函數返回一個用於分組的key對象,用於替代參key。這樣可以使用函數動態地指定根據哪些字段分組。
  •   cond:可選。查找條件,表示從哪些結果集中進行分組。
  •   finalize:可選。在reduce執行之后,結果集返回之前,對結果集進行的最終操作。可以精簡數據。

  示例:

  數據集:

  執行分組命令:

db.student.group({
    key:{age:1}, 
    initial:{"count":0}, 
    reduce:function(obj,prev) { 
        prev.count++;
    } 
})

  

 

MongoDB聚合

理解 aggregate() 方法

  Collection對象提供了對數據執行聚合操作的方法 aggregate()。該方法主要用於數據處理(諸如統計平均值,求和等),並返回計算的結果。

db.collection_name.aggregate( operator, [ operator ,...] )

  參數 operator 是一系列聚合運算符,讓您指定要在流水線的各個階段對數據執行哪種聚合操作。執行的一個運算符后,將結果傳給下一個運算符繼續運算。

  該方法直接返回一個包含聚合結果的迭代器。

使用聚合框架運算符

  MongoDB提供的聚合框架非常強大,通過 aggrgate() 方法可以反復將一個聚合運算符的結果傳遞給下一個運算符。

  注意在引用文檔中的字段名時,需要在字段名前加 $ ,表示這是一個字段值而不是字符串。

運算符 描述 示例
$project 通過重命名、添加或刪除字段來重新定義文檔。還能重新計算值以及添加子文檔 { $project : { title : " $name " } }
$match 可以實現查找的功能 { $match : { value : { $gt : 50 } } }
$limit 限制文檔數,返回結果集中的前 n 個數 { $limit : 5 }
$skip 丟棄結果集中的前 n 個文檔,效率較低,依然會遍歷前 n 個文檔 { $skip : 5 }
$unwind 其值必須是數組字段的名稱。對指定的數組進行分拆,為其中的每個值創建一個文檔 { $unwind : { $myArr } }
$group 將文檔分組並生成新的文檔,可以進行一系列子命令 { $group : { _id : " $name " , num : { $sum : 1 } } }
$sort 將文檔排序 { $sort : { name : 1 , age : -1 } }

 

MapReduce() 方法

  Map-Reduce是一種計算模型,簡單的說就是將大批量的工作(數據)分解(MAP)執行,然后再將結果合並成最終結果(REDUCE)。

  MongoDB提供的Map-Reduce非常靈活,對於大規模數據分析也相當實用。

db.collection_name.mapReduce( map , reduce , arguments );

  其中 map 是一個函數,用於分組,它將對數據集的每個對象執行它來生成一個鍵和值,這些值被加入到與鍵相關聯的數組中,供歸並階段使用。

// map 函數
function() {
    emit ( key , value );
}

  參數 reudce 也是一個函數,將對 map 函數生成的每個對象執行它。reduce 函數必須將鍵作為第一個參數,將與鍵相關聯的值數組作為第二個參數,並使用值數組來計算得到與鍵相關聯的單個值,再返回結果。

// reduce 函數 處理需要統計的字段
function ( key , value ) {
    ......統計字段處理
    return result;
}

  參數 arguments 是一個對象,指定了檢索傳遞給 map 函數的文檔時使用的選項。

{
    out : collection,      // 統計結果存放集合 (不指定則使用臨時集合,在客戶端斷開后自動刪除)。
    query : document,      // 一個篩選條件,只有滿足條件的文檔才會調用map函數。(query。limit,sort可以隨意組合)
    sort : document,       // 和limit結合的sort排序參數(也是在發往map函數前給文檔排序),可以優化分組機制 
    limit : number         // 發往map函數的文檔數量的上限(要是沒有limit,單獨使用sort的用處不大) 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM