2009-06-24 14 views
5

Come vengono implementate più query di intervallo in CouchDB? Per una singola condizione di intervallo, la combinazione startkey e endkey funziona correttamente, ma la stessa cosa non funziona con una condizione di intervallo multiplo.CouchDB supporta query a più intervalli?

My View funzione è simile a questo:

"function(doc){ 
     if ((doc['couchrest-type'] == 'Item') 
    && doc['loan_name']&& doc['loan_period']&&  
         doc['loan_amount']) 
    { emit([doc['template_id'], 
      doc['loan_name'],doc['loan_period'], 
      doc['loan_amount']],null);}}" 

ho bisogno di ottenere l'intera documentazione con loan_period> 5 e loan_amount> 30000. I miei StartKey e endkey parametri sono come questo:

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000], 
    :endkey=>["7446567e45dc5155353736cb3d6041c0",{},{},{}],:include_docs => true} 

Qui, non sto ottenendo il risultato desiderato. Penso che i miei parametri startkey e endkey siano sbagliati. Qualcuno può aiutarmi?

risposta

0

La tua dichiarazione di emissione mi sembra un po 'strana. Lo scopo di emettere è quello di produrre una chiave (cioè un indice) e poi i valori del documento che si sono interessati a

ad esempio:.

emit(doc.index, [doc.name, doc.address, ....]); 

Si sta generando una matrice per l'indice e nessun dato per la vista

Inoltre, Couchdb non prevede un'intersezione di viste in quanto non si adatta molto bene alla mappa/riduzione del paradigma. Quindi i tuoi bisogni si riducono al tentativo di indirizzare quanto segue:

Posso produrre un indice univoco da cui estrarre un intervallo particolare? (usando startkey & endkey)

4

Una vista CouchDB è un elenco ordinato di voci. Le query su una vista restituiscono una porzione contigua di quell'elenco. Pertanto, non è possibile applicare due condizioni di disuguaglianza.

Supponendo che il tuo periodo di prestito sia una variabile discreta, questo caso potrebbe essere risolto al meglio emettendo prima il prestito_periodo e quindi emettendo una query per ciascun periodo.

Una soluzione alternativa sarebbe utilizzare couchdb-lucene.

0

realtà CouchDB permette una vista di avere le chiavi complessi che sono array di valori come indicato nella domanda:

[template_id, loan_name, loan_period, loan_amount] 

Hai provato

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000], 
    :endkey=>["7446567e45dc5155353736cb3d6041c0",{}],:include_docs => true} 

o forse

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0","\u0000",5,30000], 
    :endkey=>["7446567e45dc5155353736cb3d6041c0","\u9999",{}],:include_docs => true} 
1

È stai usando gli array come chiavi. Couchdb confronterà gli array confrontando ciascun elemento dell'array in ordine crescente fino a quando due elementi non sono uguali.

E.g. per confrontare [1,'a',5] e [1,'c',0] comparirà 1 con 1, quindi 'a' con 'c' e deciderà che [1, 'a', 5] è minore di [1, 'a', 0]

Questo spiega il motivo per cui la query chiave intervallo non riesce:

["7446567e45dc5155353736cb3d6041c0",nil,5,30000] è maggiore ["7446567e45dc5155353736cb3d6041c0",nil,5,90000]