MongoDB提供了MapReduce的聚合工具來實現任意復雜的邏輯,它非常強大,非常靈活。MapReduce使用JavaScript作為“查詢語言”,能夠在多台服務器之間並行執行。它會將一個大問題拆分為多個小問題,將各個小問題發送到不同的機器上,每台機器只負責完成一部分工作。所有機器都完成時,再將這些零碎的解決方案合並為一個完整的解決方案。
在一般情況下,MapReduce操作有2個階段:第一個階段是映射(map)階段,處理每一個符合要求的文檔(即每個符合要求的文檔都執行一次map的方法),然后利用emit函數產生一些鍵和這些鍵對應的多個值(最后組成一個列表)。第二個階段是化簡(reduce)階段,把列表中的值化簡成一個單值。
MapReduce使用自定義JavaScript函數執行map和reduce操作,具有極大的靈活性,但這種強大是有代價的,MapReduce非常慢,不應該用在實時的數據分析中。
下面來看一個例子:
主要的功能:計算出每個用戶的狀態為A的訂單的總額。

首先查找所有訂單(如果mongodb有進行分片,則每個分片的訂單都會找出來)狀態為“A”的訂單。
然后每個訂單都會執行map的方法,map方法主要是輸出以cust_id為key,amount為value的一個鍵值對。緊跟着的一個步驟,是把所有相同的key的所有value,組成一個數組,傳給后面的reduce。
最后的reduce步驟,是把由map傳回來的key/value的value進行求和,得到最終以每個用戶(cust_id)為key,所有金額求和的值為value的結果。
reduce步驟產生的結果,放在“order_totals”這個集合中。可以用db.order_totals.find()來查看這整個MapReduce的結果
喜歡請微信掃描下面二維碼,關注我公眾號--“精修Java”,做一些實戰項目中的問題和解決方案分享。

