2011-01-13 11 views
5

Mam widoku couchdb „record_by_date_product” z następującą definicję:Jak zapytać o widok couchdb za pomocą klucza złożonego?

function(doc) { 
    emit([doc.logtime, doc.product_id], doc); 
} 

próbuję uruchomić kwerendę, która jest czymś w rodzaju:

(logtime > fromdate & logtime < todate) & product_id in (1,2,6) 

to możliwe z tym poglądem?

Używam również biblioteki pythona couchdb, aby uzyskać dostęp do couchdb. Oto fragment kodu:

server = couchdb.Server() 
db = server['mydb'] 

results = db.view('_design/record_by_date_product/_view/record_by_date_product') 

Ta strona http://packages.python.org/CouchDB/client.html#viewresults określa, że ​​możemy użyć startkey i endkey. Ale nie jestem w stanie sprawić, żeby działało.

Dzięki

Odpowiedz

5

myślę, że po prostu znaleźć dokładną odpowiedź:

zaprojektować view 'sampleview', który jest podobny:

{ 
    "records_by_date_product": { 
     "map": "function(doc) {\n emit([doc.prod_id, doc.logtime], doc);\n}" 
    } 
} 

Załóżmy, że parametry zapytań są:

prod_id in [1,3] 
from_date = '2010-01-01 00:00:00' 
to_date = '2010-01-02 00:00:00' 

Następnie musisz uruchomić 2 osobne zapytania w tym samym widoku:

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\["1,2010-01-01%2000:00:00"\]'&endkey='\[1,"2010-01-02%2000:00:00"\]' 

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\[2,"2010-01-01%2000:00:00"\]'&endkey='\[2,"2010-01-02%2000:00:00"\]' 

Należy zauważyć, że to samo zapytanie jest uruchamiane za każdym razem, z tą różnicą, że parametr prod_id został zmieniony w drugim zapytaniu. Wyniki należy zebrać później. Mam nadzieję że to pomoże!

+1

Jesteś tylko jedną osobą, prawda? Właśnie odpowiedziałeś na własne pytanie i powiedziałeś "Mam nadzieję, że to pomaga". W każdym razie to nie zadziała, ponieważ kolejność klawiszy jest błędna. Zakres od "[data_doczenia, 1]" i "[data_końcowa, 1]" obejmuje wiele rzeczy, których nie chcesz, np. Wszystko w zakresie dat dla identyfikatora produktu = 2. To * będzie * działać, jeśli wydasz identyfikator produktu przed datą. –

+0

Hehhe! Pomyślałem, że to pomoże także innym! :) Masz rację, będę musiał odwrócić kolejność klawiszy, a następnie zapytać o widok. Pozwól mi zrobić edycję rozwiązania. Dzięki! –

3

To dokładne zapytanie nie jest możliwe. Jak sugeruje dokumentacja, możesz uzyskać wszystko w widoku w określonym zakresie klucza. Widoki są uporządkowanymi strukturami danych, więc wszystkie CouchDB, aby spełnić to żądanie, zlokalizuj klawisz start i zacznij zwracać przedmioty, aż naciśniesz klawisz zakończenia.

Strategia, której należy użyć dla tego zapytania, zależy od charakterystyki samych danych. Co najważniejsze, zmarnujesz dużo czasu na usuwanie elementów, jeśli użyjesz tylko pierwszej części klucza (logtime) i powtórzysz te w Pythonie, usuwając elementy, które nie pasują do product_id? Jeśli tak, powinieneś rozważyć napisanie innego widoku, który jest w pierwszej kolejności sortowany według product_id. Jeśli nie, zastosuj podejście polegające na odchwaszczaniu.

-1

Jak o tym rozwiązaniu:

  1. utworzyć widok dla każdego produktu z logtime jako wskaźnika.
  2. dostępu każdego widok w razie potrzeby i filtr theresults użyciu zakresu - [fromdate todate]
  3. zrobić 3 dla każdego produktu w parametrach wejściowych i konsolidację wyników

Ma to tę wadę, że dla każdego produktu my będzie musiał utworzyć widok, a to wygląda jak proces ręczny.

Tylko myśl! Daj mi znać swoje poglądy.

+0

To może być prostsze.Wystarczy odwrócić kolejność kluczy, aby dokumenty były sortowane najpierw według produktu, a następnie według logtime. Wypytaj ten sam widok trzy razy, szukając każdego produktu w wybranym zakresie czasowym. To jest druga sugestia w odpowiedzi, którą przedłożyłem, więc jeśli ci się podoba, proszę oznaczyć ją jako zaakceptowaną :) –

+0

Witam, Jak mam "szukać każdego produktu w przedziale czasowym"? Myślę, że właśnie o to pytałem. Faktem jest, że możemy wysłać tylko datę lub zakres [początek daty końcowej] do widoku. Ale nie możemy wysyłać jednocześnie zakresu i identyfikatora produktu. Rozważam używanie list akceptujących dowolną liczbę parametrów zapytania. Poda aktualizację. Dzięki! –

+0

Możesz sprawdzić zakres i identyfikator produktu w tym samym czasie. W widokach CouchDB można używać kluczy złożonych, a użytkownik podał przykład ich zbudowania. Wszystko, co musisz zrobić, to odwrócić kolejność klucza, tak aby był to "[doc.product_id, doc.logtime]". Aby zapytać, użyj klawiszy startowych i klawiszy końcowych w tym samym formacie dwóch elementów, jak w dokumentacji, z którą się łączyłeś. –

Powiązane problemy