карта mongodb уменьшить значение - PullRequest
3 голосов
/ 27 сентября 2011

В mongodb у меня есть функция карты, как показано ниже:

var map = function() {
    emit( this.username, {count: 1, otherdata:otherdata} );
}

и уменьшите функцию как показано ниже:

var reduce = function(key, values) { 
    values.forEach(function(value){
        total += value.count; //note this line
    }
    return {count: total, otherdata: values[0].otherdata}; //please ignore otherdata
}

Проблема с записанной строкой:

total += value.count;

В моем наборе данных функция Reduce вызывается 9 раз, и предполагаемый результат сокращения карты должен составлять 8908.

В приведенной выше строке возвращенный результат будет правильно возвращен как 8908.

Но если я изменил строку на:

total += 1;

Возвращенный результат будет только 909, примерно 1/9 от предполагаемого результата.

Также я попытался распечатать (value.count), и результат печати равен 1.

Чем объясняется такое поведение?

Ответы [ 2 ]

7 голосов
/ 27 сентября 2011

короткий ответ: значение value.count не всегда равно единице.

длинный ответ: Это ожидаемое поведение карты при уменьшении: функция уменьшения агрегирует результаты функции карты.Тем не менее, он агрегирует по результатам функции карты небольшие группы, что дает промежуточные результаты (промежуточный итог в вашем случае).Затем функции сокращения снова запускаются для этих промежуточных результатов, поскольку они были прямыми результатами функции карты.И так до тех пор, пока не останется только один промежуточный результат для каждой клавиши, это итоговые результаты.

Это можно рассматривать как пирамиду промежуточных результатов:

emit(...)-|
          |- reduce -> |
emit(...)-|            |
          |            |- reduce ->|
emit(...)-|            |           |
          |            |           |
emit(...)-|- reduce -> |           |
          |                        |-> reduce = final result
emit(...)-|                        |
                                   |
emit(...)--- reduce ------------  >|
                                   |
emit(...)-----------------reduce ->|

Число уменьшенияи их входные данные непредсказуемы и должны оставаться скрытыми.Вот почему вы должны предоставить функцию Reduce, которая возвращает данные того же типа (той же схемы), что и входные данные.

2 голосов
/ 27 сентября 2011

Функция сокращения вызывается не только для исходных входных данных, но и для собственного вывода, пока не будет получен окончательный результат.Поэтому он должен быть в состоянии обработать эти промежуточные результаты, такие как [{count: 5}, {count: 3}, {count: 4}], выходящие из более ранней стадии.

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