標籤:
MongoDB除了基本查詢功能之外,還有強大的彙總工具,其中包括:count()、distinct()、group()、mapreduce.
計數函數count
count是最簡單的彙總工具,用於返迴文檔的數量:
>db.user.count() // 返回集合user的個數
傳遞查詢文檔時,則計算查詢結果的數量:
>db.user.count({"age":{"$lt":20}}) // 返回年齡小於20歲的使用者數
該函數對於分頁時的總數非常有必要
去重函數distinct
distinct函數用來找出給定鍵的所有不同的值。使用時必須指定集合和鍵:
>db.runCommand({"distinct":"user","key":"age"}) // 擷取age鍵的不同的值
有時候需要擷取集合中所有不同的鍵,此時需要自己編寫MapReduce,內建沒有這樣的函數。
values返回鍵所對應的所有不同的值,數組形式。
stats返回distinct過程的一些指標。
n:返回的集合數量,
nscanned:掃描過的文檔數量,
timems:耗費的時間(毫秒),
cursor:使用的索引(BasicCursor:無索引,BtreeCursor)
分組函數group
MongoDB會根據分組依據的鍵將集合分成若干個組,再彙總每個組內的文檔。
>db.runCommand({"group":{
"ns":"user",
"key":"day",
"initial":{"time":0},
"$reduce":function(doc,prev){
if(doc.time>prev.time){
prev.price = doc.price;
prev.time = doc.time;
}
},
"condition":{"day":{"$gt":"2014/12/21"}}
}})
"ns":"user":指定分組的集合為user
"key":"day":指定文檔分組依據的鍵
"initial":{"time":0}每一組reduce函數調用的時間,會作為初始文檔傳遞給後續過程。
"$reduce":每個文檔都對應一次這個調用。系統會傳遞兩個參數:當前文檔和累加器文檔。
"condition":指定條件
使用完成器:finalizer
完成器finalizer用於精簡資料庫傳給使用者的資料,group命令的輸出一定要能放到單個資料庫響應中。
>db.runCommand({"group":{
"ns":"post",
"key":"{"tags":true}", // 等同於"key":"tags"
"initial":{"tags":{}},
"$reduce":function(doc,prev){
for(i in doc.tags){
if(doc.tags[i] in prev.tags){
prev.tags[doc.tags[i]]++;
}else{
Prev.tags[doc.tags[i]]=1;
},
"finalize":function(prev){
var mostPopular = 0;
for(i in prev.tags){
if(prev.tags[i]>mostPopular){
prev.tag=i;
mostPopular=prev.tags[i];
}
}
Detete prev.tags
}
}}})
將$reduce處理後的結果再進行處理,然後返回給用戶端。
將函數作為鍵使用
定義分組函數時使用"$keyf"代替"key":
"$keyf":function(x){return x.category.toLowerCase();}
…
MapReduce
count、distict、group能做的事,MapReduce都能做。MapReduce的基本使用如下:
>mr=db.runCommand({"mapreduce":"user","map":map,"reduce":reduce})
"mapreduce":對哪個集合作處理
"map":map函數,可以在上述命令前先定義
"reduce":reduce函數,可以在上述命令前先定義
map函數使用函數emit返回要處理的值,this表示對當前文檔的引用:
>map=function(){
for(var key in this){
emit(key,{ "count":1});
}};
reduce能處理emit返回的文檔和其他reduce結構的各種組合:
>reduce=function(key,emits){
total = 0;
for(var I in emits){
total+=emits[i].count;
}
return {"count":total};
}
MapReduce函數的返迴文檔類似如下:
result:存放mapreduce結果的集合名,為臨時集合,mapreduce串連關閉後自動刪除。
timeMillis:操作花費的時間,單位毫秒
input:發生到map函數的文檔個數
emit:在map函數中emit被調用的次數
output:結果集合中建立的文檔數量。
MapReduce的其他可選鍵
MapReduce命令除了必須的鍵:mapreduce、map、reduce之外,還有如下的可選鍵:
finalize:對reduce的輸出結果作進一步處理
keeptemp:串連關閉時,臨時集合是否儲存。
output:結果集合的名字,設定該項則隱含著keeptemp:true。
query:會在發往map函數前,先用指定條件過濾文檔。
sort:在發往map前先給文檔排序。
limit:發往map函數的文檔數量的上限。
scope:javaScript代碼中要用到的變數(變數名:值)。
verbose:是否產生更加詳細的伺服器日誌。
MongoDB學習筆記-05 彙總