Ничего общего с шардингом, это связано с логикой Map / Reduce.
value
из функции map
должна иметь ту же форму, что и возврат из reduce
.
Помните, что reduce
может быть запущен несколько раз. Фактически, в случае шардинга, он будет запускаться один раз для каждого шарда и затем снова mongos
, делающим запрос.
Ты думаешь о том, что происходит, когда ты бежишь
reduce(key, [a,b,c])
Для работы Map / Reduce выходные данные должны совпадать со следующими:
reduce(key, [a, reduce(key, [b,c]) )
ИЛИ
reduce(key, [reduce(key, [a,b]), c] )
В вашем случае reduce(key, [b,c])
возвращает массив, поэтому вы получаете следующее:
reduce(key, [a, reduce(key, [b,c]) )
=> reduce(key, [a, [b,c] ])
Заметили дополнительный массив? Вот почему вы получаете вложение.
Для решения этой проблемы необходимо две части.
- Если
values
будет массивом, то emit
должен вывести массив с одним элементом в нем.
- Когда вы сделаете это изменение,
arr_values
будет «массивом массивов». Вам придется их правильно комбинировать.
Надеюсь, это указывает на правильное направление. Для более подробных методов отладки вы можете обратиться к странице Устранение неполадок M / R .