[MongoDB] 聚合操作概念 – 使用 mapReduce() 範例

基本概念

  • 對映(map)
  • 歸納(reduce)
  • 定型(finalize,這是 option)

主要是以下步驟:‌

  1. 執行前處理:在執行 MapReduce 前,先對集合內的資料進行篩選或排序的處理。
  2. 執行 Map 函式:Map 函式主要的功能是定義分群規則與分群後的資料內容。
  3. 執行 Reduce 函式:Reduce 函式主要的功能是合併群組內的資料。
  4. 設定輸出位置。
  5. mapReduce 執行結果。

mapReduce() 的語法如下:

db.collection.mapReduce(
  <map>,                  // 對映(map)函式
  <reduce>,               // 歸納(reduce)函式
  // options 以下為可輸入的參數
  {
    out: <collection>,    // 要輸出的集合名稱
    query: <document>,    // 查詢式
    sort: <document>,     // 排序
    limit: <number>,      // 限制資料數量
    finalize: <function>, // 定型(finalize)函式
    scope: <document>,    // 全域變數可以被 map、reduce、finalize 函式存取
    jsMode: <boolean>,    // 將 map 與 reduce 傳遞的資料使用 JavaScript 的 objects
    verbose: <boolean>,   // 是否包含處理時間的資訊
  }
)

也可以將 mapReduce 結果 results 不輸出至集合來直接顯示,透過在 mapReduce 的 outline 改輸入為 out: {inline: 1} 即可。

範例:計算來自台北市各個行政區之消費者的總人數與平均年齡

var fnmap = function(){
    emit(
        this.district,
        {count: 1, age: this.age}
    )
}

var fnreduced = function(key, values){
    var reduced = {count: 0, age: 0}
    for(var idx = 0; idx < values.length; idx++){
        var val = values[idx]
        reduced.age += val.age
        reduced.count += val.count
    }
    return reduced
}

var fnfinalized = function(key, reduced){
    reduced.avgAge = reduced.age / reduced.count;
    return reduced
}

db.getCollection('customers').mapReduce(
    fnmap,
    fnreduced,
    {
        query: {city: '台北市'},
        finalize: fnfinalized,
        out: {inline: 1}
    }
)

您可在此處留言

avatar

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料

  Subscribe  
Notify of