2013-04-26 4 views
0

У меня есть «статистика» коллекция так:Подсчитать итоговые документы в коллекции с помощью карты уменьшить?

{ "_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" } 

Как я могу найти общее количество документов в моей «статистике» коллекция с использованием карты уменьшить операцию? Вот моя карта уменьшить операцию:

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; 
} 

Но выше карта-свертка операция не возвращает общее количество документов. Мне нужно общее количество документов для сбора, которое на самом деле 5. Любой пример?

+1

это легко сделать с помощью карты/сокращения, но почему вы хотите использовать карту/сокращение, а не только db.collection.count()? –

+0

Мне нужно выполнить некоторую другую совокупность данных из той же коллекции, поэтому я должен сделать это с помощью операции map/reduce. Возможно ли запланировать мою работу по сокращению карты? Как вы можете видеть, у моей коллекции есть некоторые данные о вызовах api в ней, и я должен найти аналитику и обновить ее до какой-либо другой коллекции? –

ответ

4

Причина ваша карта/уменьшить не работает в том, что пара значений вы испускают из вашей карты должна включать в себя две вещи:

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

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

Заменить emit(this._id, 1) с emit(null, 1) и он будет работать (он не должен быть null это может быть 1 или `«коллекция»строковый литерал или что-нибудь еще, что это константа).

Если вы не делаете это как упражнение для изучения карты/уменьшения, я бы рекомендовал использовать db.collection.count(), чтобы получить количество элементов в коллекции.

+0

Отлично! Это сработало для меня. Любые мысли о планировании операции уменьшения карты для расчета ежедневной, недельной и ежемесячной аналитики из моей коллекции «Статистика»? –

+0

Вы можете запустить его через crontab из сценария оболочки, или вы можете написать программу на вашем любимом языке сценариев, используя соответствующий драйвер MongoDB для вызова mapreduce. –