2012-03-13 25 views
23

mam to w mojej funkcji Widok:couchdb lub filtrowanie na klucz tablicy

emit([doc.address.country,doc.address.state, doc.address.city], doc); 

Kiedy kwerendy wyszukiwania, muszę mieć wszystkie 3 elementy tablicy wypełnione, na przykład:

?key=["US","NY","New York"] 

że będzie produkować swoje rekordy, ale powiedzmy, na przykład, po prostu chcę, aby powrócić wszystko w Stanach Zjednoczonych na przykład:

?key=["US"] 

lub w USA i państwa ...

?key=["US","NY"] 

albo ... powiedzmy, że chcę tylko być może wszystkie rekordy z NY ... (wiem, że poniżej nie działa)

?key=["","NY"] 

Naprawdę nie wiem, jak szukać, jeśli chcesz zostawić jeden z elementów tablicy pusty?

Odpowiedz

42

pierwsze:

klucz = [ "US"] nie będzie działać na tablicy Klawisz [ "US", "Nowy Jork"], bo szukasz klucza, który jest dokładne [ "US "]. Zamiast tego trzeba użyć

startkey=["US"]&endkey=["US",{}] 

następnie te klucze są w wynikowym:

["DE","Bavaria","Munich"] <---- NO ! "DE" is out of Range of startkey 
["US","FL","Miami"]   <---- YES, starts with "US" 
["US","NY","New York"]  <---- YES, starts with "US" 
["VE","XX","Vencuela City"] <---- NO ! "VE" is out of Range of endkey 

Działa również:

startkey=["US","FL"]&endkey=["US","FL",{}] 

wynik:

["DE","Bavaria","Munich"] <---- NO ! "DE" is out of Range of startkey 
["US","FL","Miami"]   <---- YES, starts with "US","FL" 
["US","NY","New York"]  <---- NO, "US","NY" is out of Range of endkey 
["VE","XX","Vencuela City"] <---- NO ! "VE" is out of Range of endkey 

drugie: Nie można mieć wykroje na lewej stronie .. więc trzeba napisać trochę więcej emituje: (nie trzeba emitować drugi i trzeci macierzach element, jeśli nie trzeba go zapytać)

widok "byStateCityCountry":

emit([doc.address.state, doc.address.city,address.country], doc); 

view "byCityStateCountry":

emit([address.city,doc.address.state, doc.address.country], doc); 

prostu umieścić flagę w pierwszej kolejności, aby ustalić rodzaj zapytania, więc można zrobić wszystko w jednym widoku:

emit([1,address.country,doc.address.state, doc.address.city], doc); 
emit([2,doc.address.state, doc.address.city,address.country], doc); 
emit([3,address.city,doc.address.state, doc.address.country], doc); 

Zastosowanie:

?startkey=[1,"US"]&endkey=[1,"US",{}] 
?startkey=[2,"FL"]&endkey=[2,"FL",{}] 
?startkey=[3,"Miami"]&endkey=[3,"Miami",{}] 
+0

Uwaga: „Nie można mieć spacje po lewej stronie ...” - uważam, że jest odwrotnie, jeśli malejąco = true – Matt

+2

wiem, że to jest stary, ale go należy również zauważyć, że jeśli twoja tablica kluczy zawiera wiele elementów, staje się bardziej złożona. przyjmując dane w widoku z tych klawiszy: 'startkey == [a, 11], a endkey == [c, 11]: ' ' [a, 10], [A 11] < - startkey, [a, 12], [b, 10], [b, 11], [b, 12], [c, 10], [c, 11] <- endkey, [c, 12] ' (Zostaną zwrócone wszystkie elementy znajdujące się między kluczem startkey i kluczem końca.). – AdriVelaz

Powiązane problemy