Mongo散記--彙總(aggregation)& 查詢(Query),mongoaggregation

來源:互聯網
上載者:User

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是指叢集效應,比如城市叢集,電路叢集等,該詞傾向於形容事物在規模上的聚集;
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.