2011-05-28 41 views
5

Sé que puede pasar una clave o un rango para devolver registros en CouchDB, pero quiero hacer algo como esto. Encuentra registros X que son valores X.Clave compuesta con CouchDB, encontrar registros múltiples

Por ejemplo, en SQL normal, digamos que quería devolver registros con identificadores que son 5, 7, 29, 102. Me gustaría hacer algo como esto:

SELECT * FROM sometable WHERE id = 5 OR id = 7 or id = 29 or id = 102 

¿Es posible hacer esto en CouchDB, donde lanzo todos los valores que desea buscar en la matriz clave, y luego CouchDB de buscar todos los registros que pudieran existir en el "parámetro clave"?

Respuesta

4

Puede hacer una POST as documented on CouchDB wiki. Pasa la lista de claves en el cuerpo de la solicitud.

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

El inconveniente es que el navegador no almacena en caché una solicitud POST.

Como alternativa, puede obtener la misma respuesta usando un GET con el parámetro keys. Por ejemplo, se puede consultar la vista _all_docs con:

/DB/_all_docs?keys=["ID1","ID2"]&include_docs=true 

el cual, debidamente codificado URL, se convierte en:

/DB/_all_docs?keys=%5B%22ID1%22,%22ID2%22%5D&include_docs=true 

esto debería dar un mejor almacenamiento en caché, pero tenga en cuenta que _all_docs cambios en cada actualización doc . A veces, puede solucionar esto definiendo su propia vista con solo los documentos necesarios.

+1

Y el rendimiento no es lo mismo que una consulta (incluso para un rango de claves). Internamente, CouchDB simplemente vuelve a ejecutar la búsqueda de cada una de las claves. Todo lo que ahorras es latencia HTTP de ida y vuelta. (También su código podría ser más simple, con menos errores). – JasonSmith

2

Con una función de vista recta, esto no será posible. Sin embargo, puede usar una función _list para lograr el mismo resultado.

+0

Puede hacerlo en cualquier vista (incluso _todos_dos), pero debe hacer una POST en lugar de un GET. –

+2

POSTing con una lista de teclas es una solución. No es azúcar sintáctica, es decir, lo mismo pero más conveniente. No es la misma cosa. Internamente, CouchDB busca cada clave una a una. El rendimiento y la escalabilidad no son lo mismo que la búsqueda de una clave GET (o rango clave). Sin embargo, como Marcello muestra en su respuesta, puede ser muy conveniente. – JasonSmith

+0

Creo que depende de si la lista de claves es siempre la misma, o si desea poder especificar la lista de claves en "tiempo de ejecución". Si la lista es una lista fija, puede crear un único índice (función _list) que devuelva los documentos coincidentes. Si la lista es arbitraria (un parámetro), entonces couchdb tendrá que "ejecutar la búsqueda" para cada clave de todos modos, por lo que no puede ser mejor que el método POST. –

Cuestiones relacionadas