2013-04-20 2 views
0

Мне не нравится переписывать этот материал, но мне кажется, что я набрал точно такой же синтаксис, как и большинство проблем, которые я искал. Я пытаюсь просто сопоставить подсчет количества строк с ценой более 9000. Может кто-нибудь сказать мне, что я делаю неправильно?Получение количества документов (строк) с использованием mapReduce в 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

Вы делаете несколько неправильных действий: вы испускаете уникальный ключ для каждого документа: поскольку сокращение объединяет все документы с одним и тем же ключом, вы не получаете никаких агрегатов, вы также сравниваете каждое значение с 9000 вместо использования параметра запроса уменьшение карты.

Я не уверен, почему вы используете карту/уменьшить - это очень просто с каркасом агрегации:

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 он «группирует» все индивидуально? –

+0

в основном ли вы испускаете 1 или null или «foo», это не имеет значения на карте уменьшения или в агрегации - это просто означает группировку сумм по «константе», а не по значению поля. –

Смежные вопросы