Я тестирую функцию 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? В чем смысл сокращения количества результатов? Помогите мне! Заранее спасибо!!!
может быть неочевидным, почему у вас есть 101, но это на самом деле вполне предсказуемо, поскольку функция уменьшения не вызывается только один раз для каждого ключа с огромным массивом всех значений, а значения сгруппированы, а затем уменьшаются, можно назвать несколько раз, чтобы повторно уменьшить уже уменьшенное значение с помощью нового массива значений - партии из 100 приведут к 101 длине массива значений при последнем вызове. –