Wie im definitiven CouchDB-Leitfaden empfohlen, sollten Sie die Werte angeben, die Sie eindeutig haben möchten der Schlüssel, dann Abfrage der Reduce-Funktion mit group=true
.
Wenn beispielsweise keyfield
das Feld mit "key1" und "key2" ist und valuefield
das Feld mit den Werten ist, könnte Ihre Kartenfunktion wie folgt lauten:
und Ihre Reduzierungsfunktion könnte sein:
%Vor% Dann Abfrage mit group=true&startkey=["key2"]&endkey=["key2",{}]
gibt:
Basierend auf dem, was ich hier sehe (Ich werde meine Antwort bei Bedarf ändern) key1
und key2
sehen wie unabhängige Felder aus, so dass Sie zwei separate Ansichten benötigen.
Ich habe 5 einfache Dokumente in meiner Testdatenbank erstellt:
%Vor%Hier sind die 2 Suchanfragen, die Sie benötigen:
%Vor%Von dort aus kann Ihre reduce-Funktion alle Werte in einem Array zurückgeben, indem Sie einfach Folgendes tun:
%Vor% Sie haben jedoch ausdrücklich distinct -Werte erwähnt. Da JavaScript keine native unique()
-Methode für Arrays besitzt und wir CommonJS-Module nicht in View-Funktionen verwenden können, müssen wir dafür unsere eigene Logik hinzufügen. Ich kopiere einfach die erste array.unique()
Funktion, die ich bei Google gefunden habe, du kannst deine eigene schreiben, die besser optimiert ist.
Sie verwenden dieselbe Reduzierungsfunktion in beiden Ansichten. Wenn Sie eine dieser Ansichten abfragen, wird standardmäßig auch die Reduzierung ausgeführt. (Sie müssen reduce=false
explizit übergeben, um nur die Ergebnisse Ihrer Funktion map
zu erhalten.
Hier sind die Ergebnissätze, die Sie mit den obigen map/reduce
-Abfragen abrufen würden: (denken Sie daran, dass es sich um zwei separate Abfragen handelt)