2012-05-23 23 views
1

我們的MongoDB數據庫包含所有用戶帳戶的列表,其中每個新註冊在帳戶文檔中都有一個'created_at'字段,其中包含創建時的當前日期和時間。兩個看起來完全相同的MapReduce函數的令人費解的行爲

我們想知道有多少新註冊或每天有多少註冊,所以將MapReduce查詢放在一起以便爲我們找到。

db.accounts.mapReduce(
    function() { 
     var date = this.created_at.toLocaleDateString(); 
     emit(date, 1); 
    }, 
    function(key, values) { 
     return values.length; 
    }, 
    { out: "output" }) 

我們的第一次嘗試是在上面。對於每個註冊,它在該日期發出值爲1。然後使用每個陣列的長度來確定當天有多少個註冊。

然而,雖然結果大部分是正確的,但顯着的不準確。例如,當我們知道實際數字要高得多時,第一天給了我們兩位數的價值。儘管使用相同的數據,但在第二次運行地圖縮小功能後,某些值發生了變化。

我們改變了功能,而不是總結陣列的值(記住,應該只包括1的,因此等同於array.length

db.accounts.mapReduce(
    function() { 
     var date = this.created_at.toLocaleDateString(); 
     emit(date, 1); 
    }, 
    function(key, values) { 
     var sum = 0; 
     for(var i = 0; i < values.length; i++) { 
      sum += values[i]; 
     }; 
     return sum; 
    }, 
    { out: "output" }) 

出乎我們的意料,這給了正確的結果對於錯了之前每次約會。

有誰知道爲什麼第一個地圖減少沒有經營如預期?

回答

2

減少可能需要進行發射-ED值多次使用稍後的調用將通過先前調用的輸出來減少。當您只查看數組的長度時,會錯過您可能正在查看部分聚合數據的事實。總結這些值會使較早的聚合累積起來,這正是您想要的。

+0

噢,當然!知道這將是一件令人尷尬的事情。 TA! – Dave

相關問題