2009-09-23 8 views
10

El problema subyacente - digamos que mis documentos tienen "categorías" y marcas de tiempo. Si quiero todos los documentos del "foo" categoría que tienen una marca de tiempo que está dentro de las últimas dos horas, es muy sencillo:múltiples rangos de teclado como parámetros a una vista CouchDB

function (doc) { 
    emit([doc.category, doc.timestamp], null); 
} 

y luego consulta como

GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|] 

el problema viene cuando quiere algo en las categorías foo o bar, en las últimas dos horas. Si no me importara el tiempo, podría pasar directamente por la clave a través de la colección de teclas. desafortunadamente, no tengo esa opción con rangos.

Lo que terminé haciendo mientras tanto se redondear la fecha y hora de bloques de dos horas, y luego la multiplexación de la consulta a cabo:

POST server:5894/.../myview 
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]] 

Funciona, pero causar problemas si quiero volver una gran cantidad de tiempo (en relación con el tamaño de bloques).

¿Hay alguna manera de enviar múltiples pares startKey/endKey a una vista, similar a las teclas: [] matriz que se puede publicar para las claves?

Respuesta

4

Probablemente sea mejor que solo haga dos consultas. CouchDB puede manejar múltiples consultas simultáneas bastante bien, así que puede derivar varios procesos/hilos y consultar para foo y bar docs por separado.

CouchDB actualmente no admite consultas de rango múltiple. Las teclas ORing y ANDing no se pueden hacer en una consulta.

+0

bien puede O teclas a través de la publicación de claves, pero sí. Gracias. – kolosy

9

Hay una solicitud de emisión de CouchDB para que pueda hacer justamente eso. He adjuntado un parche simple, sin garantías a 0.10.1 a ese boleto que puede funcionar para usted. Funciona para mí y me permite hacer cosas como:

{ 
    "keys": [ 
     { 
      "startkey": ["0240286524","2010","03","01"], 
      "endkey": ["0240286524","2010","03","07",{}] 
     }, 
     { 
      "startkey": ["0442257276","2010","03","01"], 
      "endkey": ["0442257276","2010","03","07",{}] 
     } 
    ] 
} 

en el cuerpo de POST, lo que me permite obtener todos los datos a través de múltiples identificadores de seguimiento, para un rango de fechas. Llamo con group=true&group_level=1 para tener los resultados agrupados por ID de seguimiento. Los niveles de grupo más profundos me permitirían agrupar al rastrear id | año, id de seguimiento | año | mes, etc.

Las conexiones múltiples eran una sobrecarga no escalable para mí, ya que estaría buscando hacer 2000 al mismo tiempo :) (No, a nueva vista no es una opción - ¡ya estamos en 400GB para datos más una vista!)

El problema y el parche están en https://issues.apache.org/jira/browse/COUCHDB-523.

3

Esto ha sido agregado en las versiones más nuevas de CouchDB. Para añadir varias gamas de teclas de inicio/final, se puede utilizar una solicitud POST a la vista, con un cuerpo que se ve algo como esto:

{ 
    "queries": [ 
    { "startkey": 10, "endkey": 11 }, 
    { "startkey": 16, "endkey": 18 } 
    ] 
} 

Sé que es una vieja pregunta, pero inicialmente encontré cuando estaba buscando exactamente esto!

+0

¿Alguna referencia de doc para esto? – Isaac

+0

Todavía no, he prometido parchar los documentos ya que todavía no los tenemos. Sin embargo, lo blogueé si otro ejemplo sería útil https: // lornajane.net/posts/2017/multiple-search-keys-in-couchdb –

+0

Ah, encontré que los documentos API ya existen, están aquí: http://docs.couchdb.org/en/2.0.0/api /ddoc/views.html#sending-multiple-queries-to-a-view –

Cuestiones relacionadas