2011-10-31 60 views
3

在mongoDB映射減少我有代碼,導致一些文件被映射,但不減少。我煮下來到一個非常簡單的例子在mongoDB中文檔如何映射但不會減少?

m = function(){ 
    var a = this.visit_last_action_time.getFullYear() 
    var b = this.visit_last_action_time.getMonth() 
    var c = this.visit_last_action_time.getDate() 
    var key = new Date(a,b,c) 
    emit(key,{greeting:'hi'}) 
} 


r = function(key,values){ 
    var sum = 0; 
     for (index in values) { 
      sum ++ 
     } 
    return {count: sum} 
} 

    result = db.runCommand({ 
"mapreduce" : "piwik", 
"map" : m, 
"reduce" : r, 
"out" : "temp2", 
limit:500}) 

結果是

{ 
     "result" : "temp2", 
     "timeMillis" : 1461, 
     "counts" : { 
      "input" : 500, 
      "emit" : 500, 
      "reduce" : 13, 
      "output" : 20 
     }, 
     "ok" : 1 
    } 
> db.temp2.find({}) 
{ "_id" : ISODate("2011-01-28T00:00:00Z"), "value" : { "count" : 2 } } 
{ "_id" : ISODate("2011-01-29T00:00:00Z"), "value" : { "greeting" : "hi" } } 
{ "_id" : ISODate("2011-07-11T00:00:00Z"), "value" : { "greeting" : "hi" } } 
{ "_id" : ISODate("2011-07-13T00:00:00Z"), "value" : { "greeting" : "hi" } } 
{ "_id" : ISODate("2011-07-15T00:00:00Z"), "value" : { "count" : 2 } } 
{ "_id" : ISODate("2011-07-16T00:00:00Z"), "value" : { "count" : 7 } } 
{ "_id" : ISODate("2011-07-17T00:00:00Z"), "value" : { "count" : 39 } } 
{ "_id" : ISODate("2011-07-18T00:00:00Z"), "value" : { "count" : 172 } } 
{ "_id" : ISODate("2011-07-19T00:00:00Z"), "value" : { "count" : 248 } } 
{ "_id" : ISODate("2011-09-23T00:00:00Z"), "value" : { "count" : 3 } } 
{ "_id" : ISODate("2011-09-24T00:00:00Z"), "value" : { "count" : 5 } } 
{ "_id" : ISODate("2011-09-25T00:00:00Z"), "value" : { "count" : 4 } } 
{ "_id" : ISODate("2011-09-26T00:00:00Z"), "value" : { "count" : 2 } } 
{ "_id" : ISODate("2011-09-27T00:00:00Z"), "value" : { "count" : 2 } } 
{ "_id" : ISODate("2011-09-28T00:00:00Z"), "value" : { "count" : 5 } } 
{ "_id" : ISODate("2011-10-13T00:00:00Z"), "value" : { "greeting" : "hi" } } 
{ "_id" : ISODate("2011-10-14T00:00:00Z"), "value" : { "greeting" : "hi" } } 
{ "_id" : ISODate("2011-10-15T00:00:00Z"), "value" : { "greeting" : "hi" } } 
{ "_id" : ISODate("2011-10-18T00:00:00Z"), "value" : { "greeting" : "hi" } } 
{ "_id" : ISODate("2011-10-19T00:00:00Z"), "value" : { "count" : 2 } } 

你可以從「喜」 S一些奇怪的事情發生在這裏看到。

文件如何不可能減少?

我使用蒙戈2.0

回答

3

怎麼可能是文件沒有被還原?

只有當您需要將兩個或更多值減少爲單個值時纔會調用Reduce。

你可以在函數的簽名中看到這個。 reduce()接受一組值並返回單個值。

map發出的value的結構應該與reduce返回的結構相同。

就你而言,你的代碼違反了以下規則:reduce(key, [a]) => a

你需要改變兩兩件事:

m = ... 
    emit(key,{count:1}) 
} 

r = function(key,values){ 
    var sum = 0; 
    for (index in values) { 
     sum += values[index].count 
    } 
    return {count: sum} 
} 

注發射值的結構是如何一樣的減少值。