MongoDB學習筆記-05 彙總

來源:互聯網
上載者:User

標籤:

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 彙總

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.