面試問題用過mongodb mapreduce麼
1、概述
MongoDB中的MapReduce相當於關係資料庫中的group by。使用MapReduce要實現兩個函式Map和Reduce函式。Map函式呼叫emit(key,value),遍歷
Collection中所有的記錄,將key與value傳遞給Reduce函式進行處理。
2、MapReduce
(1)其基本語法如下所示:
[html] view plain copy print?- db.runCommand({
- mapreduce:<collection>,
- map:<mapfunction>,
-
reduce:<
- [,query:<query filter object>]
- [,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>]
- [,limit:<number of objects to return from collection>]
-
[,out:<see output options below
- [,keeptemp:<true|false>]
- [,finalize:<finalizefunction>]
- [,scope:<object where fields go into javascript global scope>]
- [,verbose:true]
- });
Mapreduce:要操作的目標集合
Map:對映函式(生成鍵值對序列,作為reduce函式引數)
Reduce:統計函式
Query:目標記錄過濾
Sort:目標記錄排序
Limit:限制目標記錄數量
Out:統計結果存放集合(不指定使用臨時集合,在客戶端斷開後自動刪除)
Keeptemp:是否保留臨時集合
Finalize:最終處理函式(對reduce返回結果進行最終整理後存入結果集合)
Scope:向map、reduce、finalize匯入外部變數
Verbose:顯示詳細的時間統計資訊。
(2)執行查詢的步驟
A.MapReduce對指定的集合Collection進行查詢
B.對A的結果集進行mapper方法採集
C.對B的結果執行finalize方法處理
D.最終結果集輸出到臨時Collection中
E.斷開連線,臨時Collection刪除或保留。
3、Map函式
Map函式呼叫當前物件進行處理,把值傳遞給reduce函式。Map方法使用this來操作當前物件,至少呼叫一次emit(key,value)方法向reduce提供引數。
其中的key為最終結果集中的_id。
4、Reduce函式
該函式接受map函式傳來的key和value值。reduce函式中的key就是emit(key,value)中的key,而value是emit函式中同一個key返回的value陣列。
5、示例
現有如下集合及資料:
下面是map函式,對age大於25的進行處理:
下面是reduce函式:
下面是mapreduce函式:
查詢結果:
從結果集可以看出,臨時結果集中的_id是emit函式中的key。