2013-07-02 110 views
0

样品DOC:的MongoDB - MapReduce的(......)不工作

{ 
    "_id" : ObjectId("51cd7274267d959cb9f95cea"), 
    "creation_time" : 100, 
    "delivered" : true, 
    "id" : 1, 
    "user_id" : 10 
} 

地图功能:

db.system.js.save({ 
    _id: "mapDummy", 
    value: function(){ 
     emit(this.user_id,this.user_id); 
    } 
}); 

Reduce函数:

db.system.js.save({ 
    _id: "reduceDummy", 
    value: function(key,values){ 
     return Array.sum(values); 
    } 
}); 

的MapReduce(...)函数调用:

db.newsdb.mapReduce("mapDummy", "reduceDummy", {out: "notifications_result", query: {delivered:true}}); 

{ 
    "result" : "notifications_result", 
    "timeMillis" : 16, 
    "counts" : { 
     "input" : 12, 
     "emit" : 0, 
     "reduce" : 0, 
     "output" : 0 
    }, 
    "ok" : 1, 
} 

为什么emit:0

回答

2

我想这是因为你使用一个字符串,而不是一个函数调用:

db.newsdb.mapReduce("mapDummy", "reduceDummy", {out: "notifications_result", query: {delivered:true}}); 

相反地图/减少我会建议你使用聚合框架(A/F)反正。你似乎在user_id上做了一个简单的分组,这对于A/F来说要好得多,因为它使用起来更快,更容易:

db.newsdb.aggregate({ $group: { _id: user_id, count: { $sum: 1 } } }); 
+0

+1是的,那就是问题所在。这个mapReduce示例只是为了试试我的手。其实我想执行一些复杂的聚合任务,这是通过A/F无法实现的 –