2009-06-24 15 views
5

¿Cómo se implementan consultas de rango múltiple en CouchDB? Para una condición de rango único, la combinación de teclas de inicio y fin funciona bien, pero lo mismo no funciona con una condición de rango múltiple.¿CouchDB es compatible con consultas de rango múltiple?

Mi función View es así:

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

que necesito para obtener el conjunto de documentos con loan_period> 5 y loan_amount> 30000. Mis StartKey y endkey parámetros son así:

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

Aquí, no estoy obteniendo el resultado deseado. Creo que mis parámetros de inicio y final son incorrectos. ¿Alguien puede ayudarme?

Respuesta

0

Tu declaración de emisión me parece un poco extraña. El propósito de Emit es producir una clave (es decir, un índice) y luego los valores de la documento que está interesado en

por ejemplo:.

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

Estás generando una matriz para el índice y no hay datos para la vista.

Además, Couchdb no proporciona una intersección de vistas, ya que no se ajusta muy bien al paradigma de mapa/reducción. Entonces, sus necesidades se reducen a intentar abordar lo siguiente:

¿Puedo producir un índice único del que pueda extraer un rango particular? (utilizando la clave de inicio & endkey)

4

Una vista de CouchDB es una lista ordenada de entradas. Las consultas en una vista devuelven una porción contigua de esa lista. Como tal, no es posible aplicar dos condiciones de desigualdad.

Suponiendo que su loan_period es una variable discreta, este caso probablemente se resolvería mejor emitiendo primero el loan_period y luego emitiendo una consulta para cada período.

Una solución alternativa sería usar couchdb-lucene.

0

En realidad CouchDB permite vistas a tener claves complejas que son matrices de valores como se indica en la pregunta:

[template_id, loan_name, loan_period, loan_amount] 

Ha intentado

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

o tal vez

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

Usted está usando matrices como sus llaves. Couchdb comparará las matrices comparando cada elemento de la matriz en orden creciente hasta que dos elementos no sean iguales.

E.g. para comparar [1,'a',5] y [1,'c',0] comparará 1 con 1, luego 'a' con 'c' y decidirá que [1, 'a', 5] es menor que [1, 'a', 0]

Esto explica por qué falla la consulta de su clave de rango:

["7446567e45dc5155353736cb3d6041c0",nil,5,30000] es mayor ["7446567e45dc5155353736cb3d6041c0",nil,5,90000]

Cuestiones relacionadas