mongodb 聚合(Map-Reduce)


  介紹

    Map-reduce 是一種數據處理范式,用於將大量數據壓縮為有用的聚合結果。對於 map-reduce 操作,MongoDB 提供MapReduce數據庫命令。

    MongoDB中的MapReduce主要有以下幾階段:

    1、Map:把一個操作Map到集合中的每一個文檔

    2、Shuffle: 根據Key分組對文檔,並且為每個不同的Key生成一系列(>=1個)的值表(List of values)。

    3、Reduce: 處理值表中的元素,直到值表中只有一個元素。然后將值表返回到Shuffle過程,循環處理,直到每個Key只對應一個值表,並且此值表中只有一個元素,這就是MR的結果。

    4、Finalize:此步驟不是必須的。在得到MR最終結果后,再進行一些數據“修剪”性質的處理。

    

 

  處理過程

  

db.runCommand({ 
    mapreduce:<collection>, 
    map:<mapfunction>,
    reduce:<reducefunction>,
    [,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>]
    [, jsMode : boolean,default true]
    [,verbose:true]
});

  參數說明:

  • Mapreduce:要操作的目標集合

  • Map:映射函數(生成鍵值對序列,作為reduce函數參數)

  • Reduce:統計函數

  • Query:目標記錄過濾

  • Sort:目標記錄排序

  • Limit:限制目標記錄數量

  • Out:統計結果存放集合(不指定使用臨時集合,在客戶端斷開后自動刪除)

  • Keeptemp:是否保留臨時集合

  • Finalize:最終處理函數(對reduce返回結果進行最終整理后存入結果集合)

  • Scope:向map、reduce、finalize導入外部變量

  • jsMode說明:為false時 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可處理非常大的mapreduce,為true時 BSON-->js-->map-->reduce-->BSON

  • Verbose:顯示詳細的時間統計信息

  

  執行查詢的步驟

  • MapReduce對指定的集合Collection進行查詢

  • 對A的結果集進行mapper方法采集

  • 對B的結果執行finalize方法處理

  • 最終結果集輸出到臨時Collection中

  • 斷開連接,臨時Collection刪除或保留

  以下是來自文檔的圖,可以清楚的說明 Map-Reduce 的執行過程。 

  

  

    MongoDB中使用emit函數向MapReduce提供Key/Value對。

    Reduce函數接受兩個參數:Key,emits. Key即為emit函數中的Key。 emits是一個數組,它的元素就是emit函數提供的Value。

    Reduce函數的返回結果必須要能被Map或者Reduce重復使用,所以返回結果必須與emits中元素結構一致。

    Map或者Reduce函數中的this關鍵字,代表當前被Mapping文檔。

 

 

  構造數據:

  

db.orders.insertMany([{cust_id:'A123',amount:500,status:'A'},
{cust_id:'A123',amount:250,status:'A'},
{cust_id:'B212',amount:200,status:'A'},
{cust_id:'A123',amount:100,status:'D'}])

  執行結果:

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM