使用分組、聚合和映射-歸併 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的用處不大) }