2010-08-23 3 views
7

Ist es möglich, similiar Abfrage in CouchDB zu benutzen? Wie verwenden zwei Schlüssel?CouchDB und mehrere Schlüssel

SELECT field FROM table WHERE value1="key1" OR value2="key2" 

Ich benutzte immer nur einen Schlüssel.

function(doc) { 

    emit(doc.title, doc); 

} 

Vielen Dank.

Antwort

0

Ja. So etwas sollte es tun, wenn ich verstehe Ihre Frage:

function(doc) { 
    a = (doc.value1 && doc.value1 == "key1"); 
    b = (doc.value2 && doc.value2 == "key2"); 
    if (a || b) { 
    emit(doc._id,doc.title); 
    } 
} 

Nur die Dokumente oder Werte emittieren Sie benötigen.

+7

Nun, sicher, wenn Sie „key1“ und „key2“ im Voraus wissen, aber was ist, wenn Sie wollen, dass sie „dynamisch“ Parameter sein? –

4

In CouchDB 0.9 und höher Sie auf einen Beitrag anzeigen kann (oder _all_docs) mit einem Körper wie:

{"keys": ["key1", "key2", ...]} 

Um die Menge der Zeilen mit den passenden Schlüssel abzurufen.

+0

Dies beantwortet die Frage nicht. Dies erhält nur die Dokumente, sobald Sie herausgefunden haben, welche Dokumente Sie möchten. Der Trick ist herauszufinden, die Liste der Dokumente, die Sie wollen. –

0

ich diese Antwort auf duluthian hinzufügen würde:

emit(doc.title, null) 

Sie können die „_id“ immer herausziehen und doc-Werte unter Verwendung der view api.

-2

Sie dies tun könnte (vorausgesetzt, Sie wollen „dynamische Parameter ") mit 2 separaten Ansichten und einer kleinen clientseitigen Verarbeitung:

Sie hätten eine Ansicht auf" field1 ", die Sie mit" value1 "abfragen würden. (Abrufen einer Liste von Dokument-IDs)

Dann abfragen Sie eine zweite Sicht auf "field2", übergeben "value2", und erhalten eine andere Liste von Doc-IDs.

Nun müssen Sie einfach auf den „Schnittpunkt“ der 2 Listen von ID-Nummern finden (links als Übung für den Leser)

+3

Es wird einfach nicht mit großen Datenmengen funktionieren. Kreuzung ist O (n log n) und es wird Clients mit genügend Ergebnissen würgen – Andrea

0

Sie eine Ansicht wie diese schaffen könnte:

function(doc){ 
    if(doc.value1) emit(doc.value1, doc.field); 
    if(doc.value2) emit(doc.value2, doc.field); 
} 

Dann fragen sie llasram Vorschlag mit mit der Ansicht POST:

{"keys": ["key1", "key2", ...]} 

Ihr Kunde allerdings vorsichtig dups sein müssen. Ein Dokument, in dem doc.value1 == "key1" & & doc.value2 == "key2" bis zweimal zeigen. Verwenden Sie _id, um die Ergebnisse zu filtern.

0

One ein wenig auf llasram Antwort erweitern muss; der Index müssen die Werte für beide Felder enthalten:

function(doc) { 
    emit("value1:"+doc.value1); // add check for undefined, null, etc. 
    emit("value2:"+doc.value2); 
} 

dann Abfrage mit

keys=["value1:key1","value2:key2"] 

EDIT: Dies jedoch wird das gleiche Dokument mehrfach berichten, wenn es die passende Wert + Schlüsselpaare enthält.