Mongo散記--彙總(aggregation)& 查詢(Query),mongoaggregation
mongo官網:http://www.mongodb.org/
工作中使用到Mongo,但是沒有系統的學習研究過Mongo,僅對工作過程中,在Mongo的使用過程中的一些知識點做一下記錄,並隨時補充,達到總結備忘的目的。
本篇主要終結記錄彙總和查詢。
彙總(aggregation)
Count
db.view_view.count()
db.view_view.count({_id:"521842"})
db.view_view.find().count()
db.view_view.find({_id:"521842"}).count()
Distinct
db.view_view.distinct("_id")
db.view_view.distinct("view") view是個數組,會把每個數組的元素都distinct一下
Group
db.invoke_stat.group({ key:{ip:true}, cond:{ date:{$gte:ISODate("2014-07-09 16:00:00"),$lt:ISODate("2014-07-10 16:00:00")} }, reduce:function(curr,result){ result.count += curr.times; }, initial:{count:0}, finalize:function(result) {result.count = '$' + result.count}});db.view_view.group({ keyf:function(doc){return {view_num:doc.view.length}}, reduce:function(curr,result){ result.count += 1; result.id = curr._id; }, initial:{count:0}});
關於以上兩個group的解釋:
key/keyf:要按照進行分組的列,key是直接選取表中的列,kef是一個函數,對列進行一些處理,函數結果要返回一個對象,比如{view_num:doc.view.length},doc.view.length,是表中的數組列view的長度。
cond:是要過濾的查詢條件
reduce:處理函數
initial:返回列的初始值
finalize:對reduce的結果進行進一步處理,比如格式化
MapReduce
db.invoke_stat.mapReduce( function(){ var key = this.ip; emit(key,{r_times:this.times}) }, function(key,emits){ total=0; for(var k in emits) { total+=emits[k].r_times; } return {r_times:total} }, {out:'mr'})
以上:r_times是我們定義的要返回的列的名稱,ip和times是表中的列,mr是我們要把MapReduce的計算結果存入名稱為mr的集合中。
mapReduce的原型為:function (map, reduce, optionsOrOutString),下面具體介紹一下函數的三個參數:
map函數,它會遍曆集合中的每一個文檔,this表示文檔,它使用emit方法將文檔按鍵分組,並返回需要統計的資料;
reduce函數,它將收集資料並統計,兩個參數分別為map函數返回的key值和資料數組;
optionsOrOutString參數為一個對象,定義了一些額外工作,比如上面的列子中使用out參數將統計結果放入到mr集合中,集合不存在則建立,存在了則覆蓋。
參數optionsOrOutString對象除了out鍵以外還有其它一些鍵:
finalize函數,同group的finalize完成器一樣,可以對reduce的結果做一些處理;
query文檔,在map函數前對文檔過濾;
sort文檔,在map函數前對文檔排序,必須先對排序的欄位建立索引;
limit整數,在map函數前設定文檔數量;
scope文檔,js函數中用到的變數,用戶端可以通過scope傳遞一些值;
jsMode布爾,指定了map和reduce函數間傳遞的對象使用BSON格式還是javascript對象,預設值false,表示採用BSON格式,優點是中間的BSON資料會被存在硬碟上,所以傳遞的資料量可以很大,但會影響效能;採用javascript對象,效能較高,但只能傳遞50萬個不同的key值;
verbos布爾,預設true,顯示詳細的時間統計資訊。
以上可以看出MapReduce的強大,可以很輕鬆的實現不同的統計功能。
查詢(Query)
mongo查詢文法:
db.access_logs_140701.find({jxTime:{$gt:1407011300,$lt:1407011400},"curl.sku":"99978033"}).sort({jxTime:-1}).skip(1).limit(100)
db.invoke_stat.find({date:{$gte:ISODate("2014-07-09 10:00:00"),$lt:ISODate("2014-07-09 11:00:00")}})
db.view_view.find({view:{$size:10}}) 查詢數組長度未10的,當前Mongo不直接支援資料長度範圍查詢,比如查詢資料長度<10的,只能MapReduce編程實現
無線路由設定裡的Aggregation MSDU(A-MSDU)是做什的?
在通道的競爭中所產生的衝突,以及為解決衝突而引入的退避機制都大大降低了系統的輸送量。802.11n為瞭解決MAC層的這兩個問題,採用了幀彙總(FrameAggregation)技術和BlockAcknowledgement機制。
幀彙總技術又包含針對MSDU的彙總(A-MSDU)和針對MPDU的彙總(A-MPDU):
A-MSDU
A-MSDU技術是指把多個MSDU通過一定的方式彙總成一個較大的載荷。這裡的MSDU可以認為是Ethernet報文。通常,當AP或無線用戶端從協議棧收到報文(MSDU)時,會打上Ethernet報文頭,這裡我們稱之為A-MSDUSubframe;而在通過射頻口發送出去前,需要逐一將其轉換成802.11報文格式。而A-MSDU技術旨在將若干個A-MSDUSubframe彙總到一起,並封裝為一個802.11報文進行發送。從而減少了發送每一個802.11報文所需的PLCPPreamble、PLCPHeader和802.11MAC頭的開銷,同時減少了應答幀的數量,提高了報文發送的效率。
A-MPDU
與A-MSDU不同的是,A-MPDU彙總的是經過802.11報文封裝後的MPDU,這裡的MPDU是指經過802.11封裝過的資料幀。通過一次性發送若干個MPDU,減少了發送每個802.11報文所需的PLCPPreamble、PLCPHeader,從而提高系統輸送量。
問aggregate與aggregation都做名詞解時有什不同
aggregate 是指事物的總和,比如數字總和,人數總和等,是一種側重強調事物在數量的集合;
aggregation是指叢集效應,比如城市叢集,電路叢集等,該詞傾向於形容事物在規模上的聚集;