2009-09-23 4 views
10

Das zugrunde liegende Problem - sagen wir meine Dokumente haben "Kategorien" und Zeitstempel. Wenn ich alle Dokumente in der „foo“ Kategorie möchten, die einen Zeitstempel aufweisen, die innerhalb der letzten zwei Stunden, es ist ganz einfach:Mehrere Tastenbereiche als Parameter für eine CouchDB-Ansicht

function (doc) { 
    emit([doc.category, doc.timestamp], null); 
} 

und dann Abfrage als

GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|] 

das Problem, wenn kommt I möchte etwas in den Kategorien foo oder bar, innerhalb der letzten zwei Stunden. Wenn mir die Zeit egal war, konnte ich einfach direkt mit dem Schlüssel durch die Schlüsselsammlung ziehen. Leider habe ich keine solche Option mit Bereichen.

Was endete ich in der Zwischenzeit nach oben tun wird, um den Zeitstempel zu zweistündige Blöcke Runden, und Multiplexen dann die Abfrage aus:

POST server:5894/.../myview 
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]] 

Es funktioniert, wird aber chaotisch, wenn ich ein zurück gehen möchten viel Zeit (im Verhältnis zur Blockgröße).

Gibt es eine Möglichkeit, mehrere startKey/endKey-Paare an eine Ansicht zu senden, ähnlich dem Schlüssel: [] Array, das für Schlüssel gebucht werden kann?

Antwort

4

Ihre wahrscheinlich besser dran nur zwei Abfragen. CouchDB kann mehrere simultane Abfragen sehr gut verarbeiten, also mehrere Prozesse/Threads ausgliedern und separat nach foo und bar docs abfragen.

CouchDB unterstützt derzeit keine Abfragen für mehrere Bereiche. ORing und ANDing-Schlüssel ist in einer Abfrage ziemlich nicht machbar.

+0

gut können Sie oder Tasten durch die Schlüssel Post, aber ja. Vielen Dank. – kolosy

9

Es gibt eine CouchDB-Anfrage, damit Sie genau das tun können. Ich habe einen einfachen, nicht garantierten Patch zu 0.10.1 an das Ticket angehängt, der für Sie funktionieren könnte. Es funktioniert für mich und lässt mich tun Dinge wie:

{ 
    "keys": [ 
     { 
      "startkey": ["0240286524","2010","03","01"], 
      "endkey": ["0240286524","2010","03","07",{}] 
     }, 
     { 
      "startkey": ["0442257276","2010","03","01"], 
      "endkey": ["0442257276","2010","03","07",{}] 
     } 
    ] 
} 

im Körper POST, die mir alle Daten über mehrere Tracking-IDs können bekommen, für eine Reihe von Terminen. Ich rufe mit group=true&group_level=1, um die Ergebnisse nach Tracking-ID gruppiert zu haben. Tiefere Gruppenstufen würden es mir ermöglichen, durch Tracking-ID | Jahr, Tracking-ID | Jahr | Monat usw. zu gruppieren.

Mehrere Verbindungen waren ein nicht skalierbarer Overhead für mich, da ich versuchen würde, 2000 gleichzeitig zu machen :) (Nein, a Neue Ansicht ist keine Option - wir haben bereits 400 GB für Daten plus eine Ansicht!)

Das Problem und Patch ist unter https://issues.apache.org/jira/browse/COUCHDB-523.

3

Dies wurde in neueren Versionen von CouchDB hinzugefügt. Um mehrere Bereiche der Start-/Ende-Tasten hinzufügen, können Sie eine POST-Anfrage zu Ihrer Ansicht verwenden, mit einem Körper, der etwa wie folgt aussieht:

{ 
    "queries": [ 
    { "startkey": 10, "endkey": 11 }, 
    { "startkey": 16, "endkey": 18 } 
    ] 
} 

Ich weiß, es ist eine alte Frage, aber ich es zunächst gefunden, als ich genau das suchend!

+0

Beliebige Doc-Verweise dafür? – Isaac

+0

Noch nicht, ich habe versprochen, die Dokumente zu patchen, da wir sie noch nicht haben! Ich habe es aber bloggen, wenn ein anderes Beispiel nützlich wäre https: // lornajane.net/posts/2017/multiple-search-keys-in-couchdb –

+0

Ah, ich habe festgestellt, dass die API-Dokumentation bereits existiert, sie sind hier: http://docs.couchdb.org/en/2.0.0/api /ddoc/views.html#sending-multiple-queries-to-a-view –