2013-04-20 76 views
0

使用MapReduce的我不想重新发布这个东西,但我感觉好像我已经输入完全一样的语法,因为大多数的我抬头问题的文件(行)的计数。我试图简单地计算出价格大于9000的行数。有人能告诉我我做错了什么吗?获得MongoDB中

var map1 = function(){ 
    if(this.price > 9000) { 
     emit(this._id, {count: 1}); 
    } 
}; 

var red1 = function(keyId, values){ 
    var count = 0; 
    values.forEach(function(v) { 
      count +=v['count']; 
      }); 

    return{count: count}; 
} 

db.plots.mapReduce(map1, red1, {out: "query1"}) 

我的结果落得这样的...

> db.query1.find() 
{ "_id" : ObjectId("5170609afa9e8646fc906815"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906816"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc90681c"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906834"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc90683e"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906846"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc90684b"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc90684e"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906851"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc90685a"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906861"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906864"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906879"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906882"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906883"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc90688b"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc90688c"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906891"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc906894"), "value" : { "count" : 1 } } 
{ "_id" : ObjectId("5170609afa9e8646fc90689a"), "value" : { "count" : 1 } } 

我想是刚刚得到一个单一的多少回。

回答

2

您正在做几件事情错误的 - 您为每个文档发出一个唯一的键:由于reduce将所有文档与相同的键组合在一起,因此您没有获得聚合,您还将每个值与9000比较,而不是使用查询选项图/减少。

我不知道为什么你正在使用的map/reduce - 这是非常简单,聚合框架:

db.plots.aggregate([ {$match:{price:{$gt:9000}}}, 
        {$group:{_id:null,count:{$sum:1}}} 
]); 

如果你有一些理由这样做地图减轻我提出以下建议:

map = function() { emit(1, 1); } 
reduce = function(key, values) { 
    var count = 0; 
    values.forEach(function(v) { 
      count +=v; 
    }); 

    return count; 
} 

db.plots.mapReduce(map, reduce, {out: "query1", query:{price:{$gt:9000}}}); 
+0

太感谢你了!这清理了很多。是否发出(1,1);强制mapReduce使用我的整个集合作为值?而且我假设你什么时候分组_id:null它会“单独”分组一切吗? – 2013-04-20 03:38:30

+0

基本上不管你发出1或null还是“foo”,它在地图缩小或聚合中都没有关系 - 它只是说按“常量”而不是字段的值对总和进行分组。 – 2013-04-20 03:51:58