Mongodb 沒有傳統數據庫的group函數,若是分組須要走MapReduce。這種MR與HadoopMR相似。下面看看Mongodb 的分組實現web
如今又一張 表它的數據格式以下:
{
"_id" : ObjectId("53b224e0a1ae72328a57702c"),
"title" : "SECJ0118E",
"criteria" : "未找到對應的錯誤碼",
"actual" : "1",
"effect" : "可能引發重大問題",
"suggestion" : "請專家提供意見",
"severity" : "Normal",
"status" : "NotOK",
"rtype" : "FormLoginExte",
"comment" : "[8/2/12 17:28:21:231 GMT+08:00] 0000001e FormLoginExte E SECJ0118E: Authentication error during authentication for user rpt",
"category" : "logs",
"time" : "0008-02-12 17:28:21"
}
{
"_id" : ObjectId("53b224e0a1ae72328a577052"),
"title" : "",
"criteria" : "未找到對應的錯誤碼",
"actual" : "1",
"effect" : "可能引發重大問題",
"suggestion" : "請專家提供意見",
"severity" : "Normal",
"status" : "NotOK",
"rtype" : "servlet",
"comment" : "[8/2/12 19:04:41:891 CST] 0000000b servlet E com.ibm.ws.webcontainer.servlet.ServletWrapper init Uncaught.init.exception.thrown.by.servlet",
"category" : "logs",
"time" : "0008-02-12 19:04:41"
}
{
"_id" : ObjectId("53b224e0a1ae72328a576fdc"),
"title" : "系統資源設置[processes]",
"criteria" : "unlimited",
"actual" : "unlimited",
"effect" : "若是對用戶資源作了limits限制,有可能形成應用運行失敗或系統性能降低。",
"suggestion" : "建議修改/etc/security/limits,編輯root相關參數部分都爲-1。",
"severity" : "None",
"status" : "OK",
"rtype" : "系統參數設置檢查",
"comment" : "",
"category" : "params"
}
1:單個條件分組
(1) 如今咱們根據title進行分組 而且統計每一個組的數量
sql
db.runCommand({ mapreduce: "check_result",
map : function Map() {
//emit 函數中的key是惟一的,是分組條件 這裏把title傳遞過來。
emit(
this.title,
{count: 1}
);
},
reduce : function Reduce(key, values) {
total=0;//定義一個變量total , values是一個數組
for( var i in values){
total +=values[i].count
}
return {"count":total};
},
finalize : function Finalize(key, reduced) {
return reduced;
},
out : { inline : 1 }
}); 數據庫
結果以下(結果中的_id鍵就是要分組的title 。value是分組後的值):
{ "_id" : "" , "value" : { "count" : 113.0}}
{ "_id" : "/tmp是否設置了t標誌位" , "value" : { "count" : 21.0}}
{ "_id" : "ASYN0080W" , "value" : { "count" : 120.0}}
{ "_id" : "AppServer的JVM堆最大值" , "value" : { "count" : 6.0}}
{ "_id" : "AppServer的JVM堆最小值" , "value" : { "count" : 6.0}}
{ "_id" : "AppServer的JVM標準輸出日誌切換週期" , "value" : { "count" : 6.0}}
{ "_id" : "AppServer的JVM標準輸出日誌回滾類型" , "value" : { "count" : 6.0}}
{ "_id" : "AppServer的JVM標準錯誤日誌切換週期" , "value" : { "count" : 6.0}}
{ "_id" : "AppServer的JVM標準錯誤日誌回滾類型" , "value" : { "count" : 6.0}}
{ "_id" : "AppServer的WebContainer線程池最大值" , "value" : { "count" : 6.0}}
{ "_id" : "AppServer的WebContainer線程池最小值" , "value" : { "count" : 6.0}}
{ "_id" : "AppServer的通用JVM參數" , "value" : { "count" : 6.0}}
{ "_id" : "AppServer的通用JVM參數-SystemGC" , "value" : { "count" : 6.0}}
{ "_id" : "Audit是否打開" , "value" : { "count" : 21.0}}
{ "_id" : "CWPKI0041W" , "value" : { "count" : 65.0}}
{ "_id" : "CWPMC0017W" , "value" : { "count" : 7.0}}
{ "_id" : "CWSAA0037W" , "value" : { "count" : 13.0}}
{ "_id" : "Could not invoke an operation on object" , "value" : { "count" : 21.0}}
{ "_id" : "DCSV0000W" , "value" : { "count" : 4.0}}
{ "_id" : "DCSV1115W" , "value" : { "count" : 137.0}}
2:多個條件分組
(1) 如今咱們根據title,status,severity進行分組 而且統計每一個組的數量
db.runCommand({ mapreduce: "check_result",
map : function Map() {
//emit 函數中的key是惟一的,是分組條件
emit(
{"title":this.title,"status":this.status,"serverity":this.severity}
,
{count: 1}
);
},
reduce : function Reduce(key, values) {
total=0;//定義一個變量total , values是一個數組
for( var i in values){
total +=values[i].count
}
return {"count":total};
},
finalize : function Finalize(key, reduced) {
return reduced;
},
out : { inline : 1 }
});
輸出結果以下格式化:
{ "_id" : { "title" : "" , "status" : "NotOK"} , "value" : { "count" : 113.0}}
{ "_id" : { "title" : "/tmp是否設置了t標誌位" , "status" : "NotOK"} , "value" : { "count" : 21.0}}
{ "_id" : { "title" : "ASYN0080W" , "status" : "NotOK"} , "value" : { "count" : 120.0}}
{ "_id" : { "title" : "AppServer的JVM堆最大值" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "AppServer的JVM堆最小值" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "AppServer的JVM標準輸出日誌切換週期" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "AppServer的JVM標準輸出日誌回滾類型" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "AppServer的JVM標準錯誤日誌切換週期" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "AppServer的JVM標準錯誤日誌回滾類型" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "AppServer的WebContainer線程池最大值" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "AppServer的WebContainer線程池最小值" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "AppServer的通用JVM參數" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "AppServer的通用JVM參數-SystemGC" , "status" : "NotOK"} , "value" : { "count" : 6.0}}
{ "_id" : { "title" : "Audit是否打開" , "status" : "NotOK"} , "value" : { "count" : 21.0}}
{ "_id" : { "title" : "CWPKI0041W" , "status" : "NotOK"} , "value" : { "count" : 65.0}}
{ "_id" : { "title" : "CWPMC0017W" , "status" : "NotOK"} , "value" : { "count" : 7.0}}
{ "_id" : { "title" : "CWSAA0037W" , "status" : "NotOK"} , "value" : { "count" : 13.0}}
{ "_id" : { "title" : "Could not invoke an operation on object" , "status" : "NotOK"} , "value" : { "count" : 21.0}}
{ "_id" : { "title" : "DCSV0000W" , "status" : "NotOK"} , "value" : { "count" : 4.0}}
{ "_id" : { "title" : "DCSV1115W" , "status" : "NotOK"} , "value" : { "count" : 137.0}}
數組