2013-04-27 4 views
0

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

Я заселена свою коллекцию с этой простой для цикла:

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 (карты, уменьшить, {из: {инлайн: 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? В чем смысл сокращения количества результатов? Помогите мне! Заранее спасибо!!!

ответ

0

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

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

+0

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

Смежные вопросы