2010-08-23 10 views
7

¿Es posible utilizar una consulta similar en CouchDB? Como uso dos llaves?CouchDB y claves múltiples

SELECT field FROM table WHERE value1="key1" OR value2="key2" 

siempre estaba usando una sola tecla.

function(doc) { 

    emit(doc.title, doc); 

} 

Gracias.

Respuesta

0

Sí. Algo como esto debe hacer el truco si entiendo su pregunta:

function(doc) { 
    a = (doc.value1 && doc.value1 == "key1"); 
    b = (doc.value2 && doc.value2 == "key2"); 
    if (a || b) { 
    emit(doc._id,doc.title); 
    } 
} 

emitir sólo los documentos o valores que necesita.

+7

Bueno, claro, si conoce "key1" y "key2" de antemano, pero ¿y si quiere que sean parámetros "dinámicos"? –

4

En CouchDB 0,9 y por encima de usted puede fijar a una vista (o _all_docs) con un cuerpo como:

{"keys": ["key1", "key2", ...]} 

Con el fin de recuperar el conjunto de filas con las marcas correspondientes.

+0

Esto no responde la pregunta. Esto solo obtiene los documentos, una vez que haya descubierto qué documentos desea. El truco está en descifrar la lista de documentos que deseas. –

0

me gustaría añadir esto a la respuesta de duluthian:

emit(doc.title, null) 

Siempre se puede sacar la "_id" y los valores doc utilizando el view api.

-2

usted puede hacer esto (si quiere enviar un "parámetros dinámicos ") usando 2 vistas separadas, y un pequeño procesamiento del lado del cliente:

Tendría una vista en" campo1 ", que consultaría con" valor1 ". (obteniendo una lista de ID de documentos)

Luego consulta una segunda vista en "campo2", pasa "valor2" y obtiene otra lista de ID de documentos.

Ahora, sólo tiene que encontrar el "cruce" de las 2 listas de números de identificación (se deja como ejercicio para el lector)

+3

Simplemente no funcionará con grandes cantidades de datos. La intersección es O (n log n) y hará que los clientes se ahoguen con suficientes resultados – Andrea

0

Se puede crear una vista como esta:

function(doc){ 
    if(doc.value1) emit(doc.value1, doc.field); 
    if(doc.value2) emit(doc.value2, doc.field); 
} 

a continuación, consulta utilizando la sugerencia de llasram para publicar en la vista con:

{"keys": ["key1", "key2", ...]} 

Su cliente tendrá que tener cuidado con los DUP sin embargo. Un documento donde doc.value1 == "key1" & & doc.value2 == "key2" aparecerá dos veces. Simplemente use _id para filtrar los resultados.

0

Uno necesita expandirse un poco en la respuesta de llasram; el índice debe contener los valores para ambos campos:

function(doc) { 
    emit("value1:"+doc.value1); // add check for undefined, null, etc. 
    emit("value2:"+doc.value2); 
} 

continuación, consultar con

keys=["value1:key1","value2:key2"] 

EDIT: Sin embargo, esto reportará el mismo documento varias veces si contiene el valor coincidente + pares de claves.

Cuestiones relacionadas