Неожиданное поведение с Mongodb Mapreduce

Я тестирую функцию mapreduce, но у меня неожиданное поведение:

Я заполнил свою коллекцию этим простым циклом for:

for (i=0; i<10000; i++) {db.coll.insert({'a':1,'b':2})}

Итак, я хочу подсчитать документы с одинаковым значением «а» (это тест :-)) Моя функция карты

map = "function() {  emit(this.a,this.b);}"

и уменьшить:

reduce = "function (key,values) {return values.length;}"

Вызов db.coll.mapReduce (карта, уменьшение, {out: {inline: 1}})

ожидаемое значение — 10000 документов с одинаковым «а», это нормально?

Но результат таков:

db.coll.mapReduce(map, reduce, {out:{inline:1}})
{
    "results" : [
            {
                    "_id" : 1,
                    "value" : 101
            }
    ],
    "timeMillis" : 892,
    "counts" : {
            "input" : 10000,
            "emit" : 10000,
            "reduce" : 100,
            "output" : 1
    },
    "ok" : 1,
}

В чем проблема??? Почему значение равно 101? В чем смысл сокращения количества результатов? Помоги мне! Заранее спасибо!!!


person Ernesto    schedule 27.04.2013    source источник


Ответы (1)


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

Взгляните на некоторые базовые примеры сокращения карт ЗДЕСЬ и посмотрите, что на самом деле работает функция уменьшения. Это каким-то образом объединяет значения для каждого уникального ключа. Ваша функция сокращения не делает этого.

person Asya Kamsky    schedule 28.04.2013
comment
может быть неочевидно, почему вы получили 101, но на самом деле это вполне предсказуемо, поскольку функция сокращения не вызывается только один раз для каждого ключа с огромным массивом всех значений, а скорее значения группируются, а затем сокращение может вызываться несколько раз, чтобы повторно - уменьшить уже уменьшенное значение с новым массивом значений - пакеты из 100 приведут к 101 длине массива значений при последнем вызове. - person Asya Kamsky; 28.04.2013