2009-09-23 9 views
10

Podstawowy problem - powiedzmy, że moje dokumenty mają "kategorie" i znaczników czasowych. Jeśli chcę wszystkie dokumenty w „foo” kategorii ze znacznikiem czasu, że w ciągu ostatnich dwóch godzin, to proste:Wiele kluczowych zakresów jako parametry widoku CouchDB

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

a następnie kwerendy

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

problem jest kiedy chcesz coś w kategoriach foo lub bar, w ciągu ostatnich dwóch godzin. Gdybym nie dbał o czas, mogłem po prostu wyciągnąć bezpośrednio przez klucz przez kolekcję kluczy. niestety nie mam takiej opcji w zakresach.

Co skończyło się robi w międzyczasie jest zaokrąglenie znacznik czasu do dwugodzinnych bloków, a następnie multipleksowanie kwerendy się:

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

To działa, ale będzie bałagan, jeśli chcę, aby przejść z powrotem duża ilość czasu (w stosunku do bloku).

Czy istnieje sposób na wysłanie wielu par startKey/endKey do widoku, podobnie jak klucze: [] tablica, która może być wysłana dla kluczy?

Odpowiedz

4

Twoja prawdopodobnie lepiej po prostu dwa pytania. CouchDB radzi sobie całkiem dobrze z wieloma równoczesnymi zapytaniami, więc wyodrębnia kilka procesów/wątków i wysyła zapytania do osobnych dokumentów foo i bar.

CouchDB obecnie nie obsługuje zapytań o wiele zakresów. Klawisze ORing i ANDing są prawie niemożliwe do wykonania w jednym zapytaniu.

+0

Cóż, możesz użyć klawiszy OR za pośrednictwem klawiszy, ale tak. dzięki. – kolosy

9

Istnieje żądanie wydania CouchDB, aby to umożliwić. Do tego biletu załączyłem prostą, bez gwarancji łatę na 0.10.1, która może ci się przydać. To działa dla mnie i pozwala mi robić takie rzeczy jak:

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

w organizmie POST, który pozwala mi uzyskać wszystkie dane z wielu identyfikatorów śledzenia dla zakresu dat. Dzwonię pod numer group=true&group_level=1, aby wyniki zostały pogrupowane według identyfikatora śledzenia. Głębsze poziomy grup pozwoliłyby mi pogrupować według identyfikatora śledzenia | rok, identyfikator śledzenia | rok | miesiąc itd.

Dla mnie wiele połączeń było nieusuwalnym obciążeniem, ponieważ chciałbym zrobić 2000 jednocześnie: (Nie, a nowy widok nie jest opcją - mamy już 400 GB danych i jeden widok!).

Problem i łata jest pod numerem https://issues.apache.org/jira/browse/COUCHDB-523.

3

Zostało to dodane w nowszych wersjach CouchDB. Aby dodać wiele zakresów kluczy start/end, można użyć żądania POST do widzenia, z korpusem, który wygląda mniej więcej tak:

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

Wiem, że to stare pytanie, ale ja początkowo znalazł go, kiedy byłem szuka dokładnie tego!

+0

Wszelkie odniesienia do dokumentów dla tego? – Isaac

+0

Jeszcze nie, obiecałem załatać dokumenty, ponieważ ich jeszcze nie mamy! Zrobiłem blog, ale jeśli inny przykład byłby przydatny https: // lornajane.net/posts/2017/multiple-search-keys-in-couchdb –

+0

Ah, stwierdziłem, że dokumenty API już istnieją, są tutaj: http://docs.couchdb.org/en/2.0.0/api /ddoc/views.html#sending-multiple-queries-to-a-view –

Powiązane problemy