mongo官網:http://www.mongodb.org/
工作中使用到Mongo,可是沒有系統的學習研究過Mongo,僅對工作過程中,在Mongo的使用過程中的一些知識點做一下記錄,并隨時補充,達到總結備忘的目的。
本篇主要終結記錄聚合和查詢。
mongodb數據恢復?
聚合(aggregation)
Count
db.view_view.count()
db.view_view.count({_id:"521842"})
mongodb聚合查詢?db.view_view.find().count()
db.view_view.find({_id:"521842"}).count()
Distinct
db.view_view.distinct("_id")
mongodb主從復制和副本集、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的解釋:
mongodb findandmodify,key/keyf:要依照進行分組的列,key是直接選取表中的列,kef是一個函數,對列進行一些處理,函數結果要返回一個對象,比方{view_num:doc.view.length},doc.view.length,是表中的數組列view的長度。
cond:是要過濾的查詢條件
reduce:處理函數
initial:返回列的初始值
finalize:對reduce的結果進行進一步處理,比方格式化
mongoclient?
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),以下詳細介紹一下函數的三個參數:
mongodb查詢集合的命令、map函數,它會遍歷集合中的每個文檔,this表示文檔,它使用emit方法將文檔按鍵分組,并返回須要統計的數據;
reduce函數,它將收集數據并統計,兩個參數分別為map函數返回的key值和數據數組;
optionsOrOutString參數為一個對象,定義了一些額外工作,比方上面的列子中使用out參數將統計結果放入到mr集合中,集合不存在則創建,存在了則覆蓋。
參數optionsOrOutString對象除了out鍵以外還有其他一些鍵:
mongodb刪除集合,finalize函數,同group的finalize完畢器一樣,能夠對reduce的結果做一些處理;
query文檔,在map函數前對文檔過濾;
sort文檔,在map函數前對文檔排序,必須先對排序的字段建立索引;
limit整數,在map函數前設定文檔數量;
scope文檔,js函數中用到的變量,client能夠通過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編程實現