Pregunta

I have "statistic" collection like that:

{ "_id" : ObjectId("4d2407265ff08824e3000001"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "POST" }
    { "_id" : ObjectId("4d2551b4ae9fa739640df821"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "GET" }
    { "_id" : ObjectId("4d255b115ff08821c2000001"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "POST" }
    { "_id" : ObjectId("4d25e8d55ff08814f8000001"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "PUT" }
    { "_id" : ObjectId("4d2407265ff08824e3700001"), "request_uri" : {"netloc":"localhost/8080", "path":"vi/sitelicense"}, "api_key" : "apikey", "request_method" : "POST" }

How can i find the total number of documents in my "statistics" collection using map reduce operation? Here is my map reduce operation:

map_number_api_calls = function() { 
  emit(this._id, 1);
}
reduce_number_api_call = function(k, v) {
  var i, sum = 0;
  for (i in v) {
    sum += v[i];
  }
  return sum;
}

But the above map-reduce operation is not returning total number of documents. I need total number of collection documents which is actually 5. Any example?

¿Fue útil?

Solución

The reason your map/reduce isn't working is that the pair of values you emit from your map has to include two things:

1. Key over which you want to aggregate values
2. Value

Your key should be a constant - i.e. you want to aggregate over the entire collection so you need to have all emitted values map to the same key.

Replace emit(this._id, 1) with emit(null, 1) and it will work (it doesn't have to be null it could be 1 or `"collection" string literal or anything else that's constant).

Unless you are doing this as an exercise to learn map/reduce, I would recommend using db.collection.count() to get the count of items in a collection.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top