剛開始瀏覽《Mongodb入門手冊》時候看到mapreduce,當時感覺好難,就直接疏忽了。現在重新看到這部份知識的時候,痛下決心學習這塊知識。
MongoDB的MapReduce相當于Mysql中“group by”,在mongodb上使用mapreduce履行并行數據統計很容易;使用MapReduce要實現兩個函數: map 和 reduce.
map函數調用emit(key,value)遍歷collection中所有的記錄,將key和value傳遞給Reduce函數履行處理。Map函數和Reduce函數可使用javascript來實現。下面我們來學習下mapreduce的方法參數:
Map函數必須調用emit(key,value)返回鍵值對,使用this訪問當前待處理的document.在本例中,map函數對students表按classid進行分組:
value可使用json object傳遞(支持多個屬性值),以下面代碼表示:
emit(this.classid,{count:1})
Reduce函數傳遞的參數類似與group 效果,將map返回的鍵值序列組合成{key,[value1,value2,value3,...]}傳遞給reduce,以下面代碼所示:
Reduce函數對這些values進行統計,在本例中,reduce函數就是分別針對班級的記錄數量進行履行求和計算,返回結果是json object 對象
計算后如何取得結果,這正是result函數的作用。可以履行db.結果集。find()可以取得結果。其中結果集合可以通過out變量指定。
利用finalize()可以對reduce的結果進行輸出樣式的格式化處理。
6. options定制輸出
還可以添加更多的控制細節,只需要在res函數的定義中加入1個query參數,既可以進1步過濾結果集,以下面的代碼所示:
對照查詢結果:
上一篇 第14周項目3-多科成績單