Карта MongoDB / уменьшить количество - PullRequest
3 голосов
/ 26 мая 2010

Вывод с карты / сокращения MongoDB включает в себя что-то вроде 'counts': {'input': I, 'emit': E, 'output': O}. Я думал, что четко понимаю, что это значит, пока не наткнулся на странный случай, который не могу объяснить.

Насколько я понимаю, counts.input - это количество строк, соответствующих условию (как указано в query). Если так, как это возможно, что следующие два запроса имеют разные результаты?

db.mycollection.find({MY_CONDITION}).count()

db.mycollection.mapReduce(SOME_MAP, SOME_REDUCE, {'query': {MY_CONDITION}}).counts.input

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

Ответы [ 2 ]

3 голосов
/ 26 мая 2010

Шаблон сопоставления / уменьшения подобен групповой функции в SQL. Таким образом, некоторые результаты группируются в одном ряду. Так что у вас не может быть одинакового количества результатов.

Число в методе mapReduce () - это число результатов после функции map / lower.

К примеру. У вас есть 2 строки:

{'id':3,'num':5}
{'id':4,'num':5}

И вы применяете функцию карты

function(){
  emit(this.num, 1);
}

После этой функции карты вы получите 2 строки:

{5, 1}
{5, 1}

И теперь вы применяете свой метод уменьшения:

function(k,vals) {
     var sum=0;
     for(var i in vals) sum += vals[i];
     return sum;
}

Теперь у вас есть только 1 строка возврата:

2
0 голосов
/ 26 мая 2010

Ваш сервер устойчиво находится между двумя вызовами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...