久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MapReduce怎么在MongoDB中使用

166次閱讀
沒有評論

共計 4433 個字符,預計需要花費 12 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

本篇文章為大家展示了 MapReduce 怎么在 MongoDB 中使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

string map = @ 
function() {
var view = this;
emit(view.activity, {pv: 1});
string reduce = @  
function(key, values) {var result = {pv: 0};
values.forEach(function(value){ 
result.pv += value.pv;
return result;
string finalize = @ 
function(key, value){return value;}

mapReduce

MongoDB 中的 MapReduce 可以用來實現更復雜的聚合命令,使用 MapReduce 主要實現兩個函數:map 函數和 reduce 函數,map 函數用來生成鍵值對序列,map 函數的結果作為 reduce 函數的參數,reduce 函數中再做進一步的統計,比如我的數據集如下:

{_id  : ObjectId( 59fa71d71fd59c3b2cd908d7), name  :  魯迅 , book  :  吶喊 , price  : 38.0, publisher  :  人民文學出版社 }
{_id  : ObjectId( 59fa71d71fd59c3b2cd908d8), name  :  曹雪芹 , book  :  紅樓夢 , price  : 22.0, publisher  :  人民文學出版社 }
{_id  : ObjectId( 59fa71d71fd59c3b2cd908d9), name  :  錢鐘書 , book  :  宋詩選注 , price  : 99.0, publisher  :  人民文學出版社 }
{_id  : ObjectId( 59fa71d71fd59c3b2cd908da), name  :  錢鐘書 , book  :  談藝錄 , price  : 66.0, publisher  :  三聯書店 }
{_id  : ObjectId( 59fa71d71fd59c3b2cd908db), name  :  魯迅 , book  :  彷徨 , price  : 55.0, publisher  :  花城出版社 }

假如我想查詢每位作者所出的書的總價,操作如下:

var map=function(){emit(this.name,this.price)}
var reduce=function(key,value){return Array.sum(value)}
var options={out: totalPrice}
db.sang_books.mapReduce(map,reduce,options);
db.totalPrice.find()

emit 函數主要用來實現分組,接收兩個參數,第一個參數表示分組的字段,第二個參數表示要統計的數據,reduce 來做具體的數據處理操作,接收兩個參數,對應 emit 方法的兩個參數,這里使用了 Array 中的 sum 函數對 price 字段進行自加處理,options 中定義了將結果輸出的集合,屆時我們將在這個集合中去查詢數據,默認情況下,這個集合即使在數據庫重啟后也會保留,并且保留集合中的數據。

查詢結果如下:

{
  _id  :  曹雪芹 ,
  value  : 22.0
  _id  :  錢鐘書 ,
  value  : 165.0
  _id  :  魯迅 ,
  value  : 93.0
}

再比如我想查詢每位作者出了幾本書,如下:

var map=function(){emit(this.name,1)}
var reduce=function(key,value){return Array.sum(value)}
var options={out: bookNum}
db.sang_books.mapReduce(map,reduce,options);
db.bookNum.find()

查詢結果如下:

{
  _id  :  曹雪芹 ,
  value  : 1.0
  _id  :  錢鐘書 ,
  value  : 2.0
  _id  :  魯迅 ,
  value  : 2.0
}

將每位作者的書列出來,如下:

var map=function(){emit(this.name,this.book)}
var reduce=function(key,value){return value.join( ,)}
var options={out: books}
db.sang_books.mapReduce(map,reduce,options);
db.books.find()

結果如下:

{
  _id  :  曹雪芹 ,
  value  :  紅樓夢 
  _id  :  錢鐘書 ,
  value  :  宋詩選注, 談藝錄 
  _id  :  魯迅 ,
  value  :  吶喊, 彷徨 
}

比如查詢每個人售價在¥40 以上的書:

var map=function(){emit(this.name,this.book)}
var reduce=function(key,value){return value.join( ,)}
var options={query:{price:{$gt:40}},out: books }
db.sang_books.mapReduce(map,reduce,options);
db.books.find()

query 表示對查到的集合再進行篩選。

結果如下:

{
  _id  :  錢鐘書 ,
  value  :  宋詩選注, 談藝錄 
  _id  :  魯迅 ,
  value  :  彷徨 
}

runCommand 實現

我們也可以利用 runCommand 命令來執行 MapReduce。格式如下:

db.runCommand(
 {
 mapReduce:  collection ,
 map:  function ,
 reduce:  function ,
 finalize:  function ,
 out:  output ,
 query:  document ,
 sort:  document ,
 limit:  number ,
 scope:  document ,
 jsMode:  boolean ,
 verbose:  boolean ,
 bypassDocumentValidation:  boolean ,
 collation:  document 
 }
 )

含義如下:

參數含義 mapReduce 表示要操作的集合 mapmap 函數 reducereduce 函數 finalize 最終處理函數 out 輸出的集合 query 對結果進行過濾 sort 對結果排序 limit 返回的結果數 scope 設置參數值,在這里設置的值在 map、reduce、finalize 函數中可見 jsMode 是否將 map 執行的中間數據由 javascript 對象轉換成 BSON 對象,默認為 falseverbose 是否顯示詳細的時間統計信息 bypassDocumentValidation 是否繞過文檔驗證 collation 其他一些校對

如下操作,表示執行 MapReduce 操作并對統計的集合限制返回條數,限制返回條數之后再進行統計操作,如下:

var map=function(){emit(this.name,this.book)}
var reduce=function(key,value){return value.join( ,)}
db.runCommand({mapreduce: sang_books ,map,reduce,out: books ,limit:4,verbose:true})
db.books.find()

執行結果如下:

{
  _id  :  曹雪芹 ,
  value  :  紅樓夢 
  _id  :  錢鐘書 ,
  value  :  宋詩選注, 談藝錄 
  _id  :  魯迅 ,
  value  :  吶喊 
}

小伙伴們看到,魯迅有一本書不見了,就是因為 limit 是先限制集合返回條數,然后再執行統計操作。

finalize 操作表示最終處理函數,如下:

var f1 = function(key,reduceValue){var obj={};obj.author=key;obj.books=reduceValue; return obj}
var map=function(){emit(this.name,this.book)}
var reduce=function(key,value){return value.join( ,)}
db.runCommand({mapreduce: sang_books ,map,reduce,out: books ,finalize:f1})
db.books.find()

f1 第一個參數 key 表示 emit 中的第一個參數,第二個參數表示 reduce 的執行結果,我們可以在 f1 中對這個結果進行再處理,結果如下:

{
  _id  :  曹雪芹 ,
  value  : {
  author  :  曹雪芹 ,
  books  :  紅樓夢 
 }
  _id  :  錢鐘書 ,
  value  : {
  author  :  錢鐘書 ,
  books  :  宋詩選注, 談藝錄 
 }
  _id  :  魯迅 ,
  value  : {
  author  :  魯迅 ,
  books  :  吶喊, 彷徨 
 }
}

scope 則可以用來定義一個在 map、reduce 和 finalize 中都可見的變量,如下:

var f1 = function(key,reduceValue){var obj={};obj.author=key;obj.books=reduceValue;obj.sang=sang; return obj}
var map=function(){emit(this.name,this.book)}
var reduce=function(key,value){return value.join( ,-- +sang+ --,)}
db.runCommand({mapreduce: sang_books ,map,reduce,out: books ,finalize:f1,scope:{sang: haha}})
db.books.find()

執行結果如下:

{
  _id  :  曹雪芹 ,
  value  : {
  author  :  曹雪芹 ,
  books  :  紅樓夢 ,
  sang  :  haha 
 }
  _id  :  錢鐘書 ,
  value  : {
  author  :  錢鐘書 ,
  books  :  宋詩選注,--haha--, 談藝錄 ,
  sang  :  haha 
 }
  _id  :  魯迅 ,
  value  : {
  author  :  魯迅 ,
  books  :  吶喊,--haha--, 彷徨 ,
  sang  :  haha 
 }
}

上述內容就是 MapReduce 怎么在 MongoDB 中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注丸趣 TV 行業資訊頻道。

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計4433字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 新平| 家居| 桂林市| 大悟县| 娄底市| 平乐县| 垦利县| 明溪县| 珲春市| 怀来县| 洱源县| 咸丰县| 新乡市| 寿宁县| 金平| 淮南市| 金塔县| 云霄县| 靖远县| 扶绥县| 通江县| 财经| 深州市| 松江区| 吴旗县| 兰坪| 五常市| 嵊州市| 汽车| 城口县| 潮安县| 济宁市| 尼玛县| 崇文区| 新和县| 叙永县| 司法| 余江县| 麦盖提县| 清镇市| 原阳县|