Das Problem liegt in Ihrer benutzerdefinierten Reduce-Funktion: Sie nicht den Fall behandeln, wenn es als Teil einer Reduce aufgerufen wird.
Per 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:
Bold Formatierung ist mein, und die markierten Wörter sind ganz wichtig: Sie, dass manchmal in Betracht ziehen sollten, werden Sie das keys
Argument mit einem Wert von null
erhalten.
die Dokumentation nach, sollten Sie den Fall behandeln, wenn rereduce
true
in Ihrer reduce()
Funktion ist, und Sie sollten in diesem Fall wissen, dass keys
null
sein wird. Im Falle Ihrer reduce()
Funktion, können Sie etwas tun:
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;
});
}
Hier bin ich Umgang zunächst die Wieder reduzieren Phase. Dafür verflach ich das Array von Arrays, die ich im values
-Argument empfange, und dann entferne ich die Duplikate, die nach der Zusammenführung aufgetreten sein könnten.
Dann kommt Ihr ursprünglicher Code, der das keys
Argumentarray ohne Duplikate zurückgibt.
function(doc, meta) {
switch(doc.type) {
case "brewery":
emit(meta.id, null);
emit(meta.id, null);
break;
}
}
Dies erzeugt absichtlich Duplikate, die dann durch die reduce()
Funktion entfernt werden:
Um zu testen, dass diese reduce()
Funktion tatsächlich funktioniert, habe ich die folgende map()
Funktion verwendet.
[Das machte null Änderung] (http://i.imgur.com/umLy8mE.png). Es genügt zu sagen, ich habe versucht, 'meta.id' als Schlüssel und Wert auszugeben; NULL und das Dokument als Schlüssel/Wert und Kombinationen von beiden, sowie das Ändern der Reduzierungsfunktion, um mit dem Schlüssel/Wert zu arbeiten. Alle haben zu demselben Fehler geführt. – FrankerZ
Wie in meiner Frage erwähnt, ist dieser Fehler auch in der Community-Version 3.0.1 aufgetreten. – FrankerZ
@FrankerZ Bitte überprüfen Sie die aktualisierte Antwort. –