2013-05-08 19 views
0

我想在Mongo中使用mapreduce計數一個給定值顯示的次數。MongoDB Map Reduce顯示「[對象對象]」作爲鍵儘管類型檢查對他們

這裏是我的地圖功能,我測試,以確保每一個值的字符串:

function mapFunction() { 
    function normalizeDate(date) { 
     var day = date.getDay(), 
     month = date.getMonth(), 
     year = date.getYear(); 
     return new Date(year, month, day); 
    } 

    if (this.events.event.toString() === "[object Object]" 
     || typeof(this.events.event) !== 'string') { 
      throw new Error("Not a string..."); 
    } 

    emit(normalizeDate(this.date), this.events.event); 
} 

這裏是我的降低作用,爲完整起見:

function reduceFunction (date, event_arry) { 
    return event_arry.reduce(function (a, b) { 
    if (a[b]) { 
     a[b]++; 
    } 
    else { 
     a[b] = 1; 
    } 
    return a; 
    }, {}); 
} 

然後,我在mongo repl中運行mapReduce:

mongos> db.events.mapReduce(mapFunction, reduceFunction, {out: 'mr_test'}) 
{ 
    "result" : "mr_test", 
    "timeMillis" : 148, 
    "counts" : { 
     "input" : 3481, 
     "emit" : 3481, 
     "reduce" : 82, 
     "output" : 14 
    }, 
    "ok" : 1, 
} 

並且沒有錯誤,表明所有的event s是string

然而,當我看輸出mr_test集合中,我得到幾個條目是這樣的:

mongos> db.mr_test.find() 
{ "_id" : ISODate("0113-04-05T00:00:00Z"), "value" : { "[object Object]" : 4 } } 
{ "_id" : ISODate("0113-04-06T00:00:00Z"), "value" : { "[object Object]" : 5 } } 
{ "_id" : ISODate("0113-04-30T00:00:00Z"), "value" : { "[object Object]" : 1, "eventTypeA" : 9, "eventTypeB" : 14, "eventTypeC" : 19 } } 

是否有一個很好的解釋這個?如果是這樣,那是什麼?

回答

2

有這個一個很好的解釋(這是同樣的事情用MongoDB的MapReduce的所有問題,99%是你的地圖值是不同的格式比你的減少正在恢復。

你減少函數必須返回相同的格式。您的地圖功能發出

你都散發出字符串,你希望得到一個文件,你需要做的是在你的地圖功能發出的確切格式你期望在最後:

emit(normalizeDate(this.date), {this.events.event:1}); 

這就是說:「f或某一天(關鍵)我正在跟蹤一個事件字符串,其總數爲1「。

然後調整您的reduce函數以遍歷values數組並將其合併在一起,同時牢記由於可以多次調用reduce函數(以重新減少特定鍵的結果)您正在「合併」的文檔或減少可以是單個{日期:數字}或具有多個{date1:​​number,date2:number,...}的複雜文檔