2013-04-20 85 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