1. 程式人生 > >面試問題用過mongodb mapreduce麼

面試問題用過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?
  1. db.runCommand({  
  2.     mapreduce:<collection>,  
  3.     map:<mapfunction>,  
  4.     reduce:<
    reducefunction>,  
  5.     [,query:<query filter object>]  
  6.     [,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>]  
  7.     [,limit:<number of objects to return from collection>]  
  8.     [,out:<see output options below
    >]  
  9.     [,keeptemp:<true|false>]  
  10.     [,finalize:<finalizefunction>]  
  11.     [,scope:<object where fields go into javascript global scope>]  
  12.     [,verbose:true]  
  13. });  
引數說明:

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。