Проблема заключается в вашей пользовательской функции уменьшения: вы не обрабатываете корпус, когда его вызывают как часть повторного уменьшения.
По Couchbase documentation:
The base format of the reduce() function is as follows:
function(key, values, rereduce) {
...
return retval;
}
The reduce function is supplied three arguments:
key
: The key is the unique key derived from the map() function and the group_level parameter.
values
: The values argument is an array of all of the values that match a particular key. For example, if the same key is output three times, data will be an array of three items containing, with each item containing the value output by the emit() function.
rereduce
: The rereduce indicates whether the function is being called as part of a re-reduce, that is, the reduce function being called again to further reduce the input data.
When rereduce
is false:
The supplied key
argument will be an array where the first argument is the key
as emitted by the map function, and the id
is the document ID that generated the key.
The values is an array of values where each element of the array matches the corresponding element within the array of keys
.
When rereduce
is true:
Жирного форматирование мое, и подсвеченные слова очень важны: вы должны учитывать, что иногда вы будете получать keys
аргумент со значением null
.
Согласно документации, вы должны обрабатывать случай, когда rereduce
является true
в вашей reduce()
функции, и вы должны знать, что в этом случае keys
будет null
. В случае Вашей reduce()
функции, вы могли бы сделать что-то вроде этого:
function(keys, values, rereduce) {
if (rereduce) {
var result = [];
for (var i = 0; i < values.length; i++) {
var distinct = values[i];
for (var j = 0; j < distinct.length; j++) {
result.push(distinct[j]);
}
}
return result.filter(function (e, i, arr) {
return arr.lastIndexOf(e) === i;
});
}
return keys.filter(function (e, i, arr) {
return arr.lastIndexOf(e) === i;
});
}
Вот, я в первую очередь обработки фазы повторного снижения. Для этого я сглаживаю массив массивов, которые получаю в аргументе values
, а затем я удаляю дубликаты, которые могли появиться после слияния.
Затем наступает исходный код, который возвращает массив аргументов keys
без дубликатов.
Чтобы проверить, что это reduce()
функция на самом деле работает, я использовал следующую map()
функцию:
function(doc, meta) {
switch(doc.type) {
case "brewery":
emit(meta.id, null);
emit(meta.id, null);
break;
}
}
Это намеренно создает дубликаты, которые затем удаляются с помощью функции reduce()
.
[Это сделало нулевое изменение] (http://i.imgur.com/umLy8mE.png). Достаточно сказать, что я попытался исправить «meta.id» как ключ и значение; null и документ как ключ/значение, так и комбинации обоих, а также изменение функции уменьшения для работы с ключом/значением. Все они привели к той же ошибке. – FrankerZ
Как я уже упоминал в своем вопросе, эта ошибка произошла и в версии 3.0.1 community. – FrankerZ
@FrankerZ Пожалуйста, проверьте обновленный ответ. –