共計 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 問一下細節