2012-03-12 39 views
0

的最大總和我有采購交易的集合:MongoDB的地圖找到降低採購

{....,"userId": "1","amount":3,....} 
{....,"userId": "1","amount":1,....} 
{....,"userId": "2","amount":4,....} 
{....,"userId": "1","amount":2,....} 

我需要與購買的最大金額和與合計本身打印用戶ID。

我沒有問題,讓使用地圖的採購金額降低:

function map(){ 
    emit(this.userID,{amount:this.amount}); 
} 

進而降低:

function reduce(key,value){ 
    var sum = 0; 
    for (var i=0; i<value.length; i++) { 

      sum += value[i].amount; 
    } 
    return sum; 
} 

我明白,我需要使用完成功能來選擇最大的成果和回報它作爲單一的收藏。
如何使用finalize函數來選擇最大的結果? 你能幫忙嗎?

更新:

在SQL方面,它應該是這樣的:

select MAX(tbl.amn), tbl.uid from 
(select o, userID as uid, SUM(o.amount) as amn from order o GROUP BY o.userID) as tbl GROUP BY tbl.uid 
+0

「最大購買金額」有點含糊不清,你的意思是最高金額? – misaxi 2012-03-12 23:00:55

+0

@misaxi,看我的更新。 – 2012-03-13 06:04:19

+0

對不起,但我不熟悉SQL語句... – misaxi 2012-03-14 00:11:23

回答

1
  • 輸出你的map/reduce結果到一個集合。
  • 建立金額索引。
  • 查詢順序按金額遞減。
+0

謝謝。另一個問題,我可以做原子操作嗎?因爲我需要確保另一個請求不會覆蓋輸出集合。 – 2012-03-13 18:25:36

+0

當然你可以通過腳本自動完成。你可以使用[Incremental Map/Reduce](http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce)來保持你的輸出集合是最新的,並記住你關心的字段上的ensureIndexes – misaxi 2012-03-14 00:15:33

+0

比你的反應更好,我目前正在爲MongoDB和Java/Spring容器做一些POC。我開始使用增量Map/Reduce,並且我選擇了一個問題,在從初始Orders集合中刪除具有特定用戶ID的集合並再次運行incrememtal MR函數後,我仍然可以看到已刪除值的總和。如何在運行MR時刪除這些陳舊的值? – 2012-03-16 20:37:03