根據(jù)MongoDB文檔的說(shuō)明,Map-reduce是將大量數(shù)據(jù)合并為有用的聚合結(jié)果的數(shù)據(jù)處理范例。 MongoDB使用mapReduce命令進(jìn)行map-reduce操作。MapReduce通常用于處理大型數(shù)據(jù)集。
以下是基本 mapReduce 命令的語(yǔ)法 -
>db.collection.mapReduce(
function() {emit(key,value);}, //map function
function(key,values) {return reduceFunction}, { //reduce function
out: collection,
query: document,
sort: document,
limit: number
}
)
map-reduce函數(shù)首先查詢集合,然后將結(jié)果文檔映射到發(fā)出的鍵值對(duì),然后根據(jù)具有多個(gè)值的鍵進(jìn)行減少。
在上面的語(yǔ)法 -
map是一個(gè)JavaScript函數(shù),它將一個(gè)值與一個(gè)鍵映射并發(fā)出一個(gè)鍵值對(duì);reduce是一個(gè)javascript功能,可以減少或分組具有相同鍵的所有文檔;out指定map-reduce查詢結(jié)果的位置;query指定選擇文檔的可選選擇條件;sort指定可選的排序條件;limit指定可選的最大文檔數(shù);請(qǐng)考慮存儲(chǔ)用戶帖子的以下文檔結(jié)構(gòu)。 該文檔存儲(chǔ)用戶的user_name和帖子的狀態(tài)(status)。
{
"post_text": "yiibai tutorials is an awesome website for tutorials",
"user_name": "maxsu",
"status":"active"
}
現(xiàn)在,我們將在posts集上使用mapReduce函數(shù)來(lái)選擇所有status的值為active的帖子,并根據(jù)user_name分組,然后使用以下代碼對(duì)每個(gè)用戶的帖子數(shù)進(jìn)行計(jì)數(shù) -
>db.posts.mapReduce(
function() { emit(this.user_id,1); },
function(key, values) {return Array.sum(values)}, {
query:{status:"active"},
out:"post_total"
}
)
以上mapReduce查詢輸出以下結(jié)果 -
{
"result" : "post_total",
"timeMillis" : 9,
"counts" : {
"input" : 4,
"emit" : 4,
"reduce" : 2,
"output" : 2
},
"ok" : 1,
}
結(jié)果表明,共有4個(gè)文檔與查詢(status的值為active)匹配,映射函數(shù)發(fā)出4個(gè)具有鍵值對(duì)的文檔,最后將具有相同鍵的reduce函數(shù)分組的映射文檔分解為2。
要查看此 mapReduce 查詢的結(jié)果,請(qǐng)使用 find 運(yùn)算符 -
>db.posts.mapReduce(
function() { emit(this.user_id,1); },
function(key, values) {return Array.sum(values)}, {
query:{status:"active"},
out:"post_total"
}
).find()
上述查詢給出以下結(jié)果,表明用戶 tom 和 maxsu 有兩個(gè)活動(dòng)狀態(tài)的帖子 -
{ "_id" : "tom", "value" : 2 }
{ "_id" : "maxsu", "value" : 2 }
以類(lèi)似的方式,MapReduce查詢可用于構(gòu)建大型復(fù)雜聚合查詢。 使用自定義JavaScript函數(shù)可以使用MapReduce,它非常靈活和強(qiáng)大。