2012-03-13 13 views
23

Ho questa nel mio funzione visione:couchdb o filtrano matrice chiave

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

Quando interrogo la ricerca, ho bisogno di avere tutti i 3 elementi dell'array compilato, ad esempio:

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

che produrrà i miei dischi, ma consente di dire, per esempio, voglio solo tornare tutto negli Stati Uniti, ad esempio:

?key=["US"] 

o negli Stati Uniti e dello Stato ...

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

O ... Diciamo che forse voglio solo tutti i record da NY ... (so che il seguito non funziona)

?key=["","NY"] 

Non riesco davvero a capire come cercare se si vuole lasciare vuoto uno degli elementi dell'array?

risposta

42

Primo:

key = [ "USA"] non funzionerà su una serie chiave [ "USA", "NY"], perché siete alla ricerca di una chiave che è ESATTO [ "USA "]. Invece, è necessario utilizzare

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

poi quelle chiavi sono nel gruppo di risultati:

["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 

lavoro anche:

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

risultato:

["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 

Secondo: Non si può avere spazi vuoti sul lato sinistro .. così si deve scrivere qualche altra emette: (non c'è bisogno di emettere la seconda e la terza serie-oggetto, se non è necessario eseguire una query)

vista "byStateCityCountry":

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

vista "byCityStateCountry":

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

di appena messo una bandiera in primo luogo per determinare il tipo di query, in modo da poter fare tutto in una sola vista:

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); 

Usage:

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

Nota: "Non si può avere spazi vuoti sul lato sinistro ..." - credo che è vero il contrario se si è decrescente = true – Matt

+2

So che questo è vecchio, ma è Va anche notato che se il tuo array di chiavi ha molti elementi diventa più complesso. supponendo i seguenti dati nella tua vista con questi tasti: 'StartKey == [a, 11] e endkey == [c, 11]:' ' [a, 10], [a, 11] < - startkey, [a, 12], [b, 10], [b, 11], [b, 12], [c, 10], [c, 11] <- endkey, [c, 12] ' (verrà restituito tutto compreso tra la chiave iniziale e la chiave finale). – AdriVelaz