新聞中心

創(chuàng)新互聯(lián)建站2013年至今,公司以做網(wǎng)站、網(wǎng)站設(shè)計、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶1000多家,涉及國內(nèi)多個省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計、宣傳推廣等服務(wù)。 通過專業(yè)的設(shè)計、獨特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。
在 MongoDB 中我們可以使用 mapReduce 命令來執(zhí)行 mapReduce 操作。
mapReduce 命令
在 mapReduce 命令中要實現(xiàn)兩個函數(shù),分別是 map 函數(shù)和 reduce 函數(shù),其中 map 函數(shù)調(diào)用 emit(key, value),遍歷集合中的所有記錄,并將 key 與 value 傳遞給 reduce 函數(shù)進行處理,如下所示:
> db.collection_name.mapReduce(
function() {emit(key, value);}, // map 函數(shù)
function(key, values) {return reduceFunction}, // reduce 函數(shù)
{
out: collection,
query: document,
sort: document,
limit: number
}
)
參數(shù)說明如下:
- map 函數(shù):一個 javascript 函數(shù),它用一個鍵映射一個值并發(fā)出一個鍵值對;
- reduce 函數(shù):一個 javascript 函數(shù),用于減少或分組具有相同鍵的所有文檔;
- out:指定 map-reduce 查詢結(jié)果的位置;
- query:指定用于選擇文檔的可選選擇條件;
- sort:指定可選的排序條件;
- limit:指定要返回的最大文檔數(shù)(可選)。
使用 mapReduce
假如有一個存儲用戶帖子信息的集合,其中存儲了若干用戶的用戶名、狀態(tài)等信息,例如下面這樣:
{
"post_text": "編程幫(biancheng.net),一個在線學(xué)習(xí)編程的網(wǎng)站,專注于分享優(yōu)質(zhì)編程教程。",
"user_name": "bianchengbang",
"status":"active"
}
接下來在上述的集合中使用 mapReduce 命令來選擇集合中所有
"status":"active" 的文檔,然后根據(jù)用戶名對它們進行分組,最后統(tǒng)計每個用戶的發(fā)帖數(shù)量。示例代碼如下:
> db.posts.mapReduce(
... function() { emit(this.user_name,1); },
... function(key, values) {return Array.sum(values)},
... {
... query:{status:"active"},
... out:"post_total"
... }
... )
上面 mapReduce 命令的輸出結(jié)果如下所示:
{
"result" : "post_total",
"timeMillis" : 48,
"counts" : {
"input" : 11,
"emit" : 11,
"reduce" : 2,
"output" : 2
},
"ok" : 1
}
關(guān)于運行結(jié)果,有如下幾點需要說明:
- result:儲存結(jié)果的 collection 的名字,這是個臨時集合,mapReduce 的連接關(guān)閉后會被自動刪除;
- timeMillis:執(zhí)行花費的時間,單位為毫秒;
- input:滿足條件被發(fā)送到 map 函數(shù)的文檔個數(shù);
- emit:在 map 函數(shù)中 emit 被調(diào)用的次數(shù),也就是所有集合中的數(shù)據(jù)總量;
- ouput:結(jié)果集合中的文檔個數(shù)(count 對調(diào)試非常有幫助);
- ok:查詢是否執(zhí)行成功,成功為 1;
- err:若執(zhí)行失敗,則會在這里顯示失敗原因。
通過運行結(jié)果可以發(fā)現(xiàn),共有 11 個文檔與查詢匹配(狀態(tài)為“active”),map 函數(shù)生成了 11 個具有鍵值對的文檔,最后 reduce 函數(shù)將具有相同鍵值的映射文檔分為 2 個組。
若要查看 mapReduce 查詢的結(jié)果,可以使用 find 方法,如下所示:
> db.posts.mapReduce(
... function() { emit(this.user_name,1); },
... function(key, values) {return Array.sum(values)},
... {
... query:{status:"active"},
... out:"post_total"
... }
... ).find()
上面的查詢語句,執(zhí)行結(jié)果如下:
{ "_id" : "biancheng", "value" : 5 }
{ "_id" : "bianchengbang", "value" : 6 }
以類似的方式,mapReduce 查詢可用于構(gòu)造大型復(fù)雜的聚合查詢,自定義 JavaScript 函數(shù)的使用使得 mapReduce 非常靈活和強大。
網(wǎng)站標(biāo)題:MongoDBMapReduce
URL網(wǎng)址:http://fisionsoft.com.cn/article/dphjojp.html


咨詢
建站咨詢
