2011-01-13 8 views
5

que tienen una visión couchdb "record_by_date_product" con la siguiente definición:¿Cómo consultar una vista de sofá mediante una clave compuesta?

function(doc) { 
    emit([doc.logtime, doc.product_id], doc); 
} 

Estoy tratando de ejecutar una consulta que es algo así como:

(logtime > fromdate & logtime < todate) & product_id in (1,2,6) 

¿Es esto posible con este punto de vista?

También estoy usando la biblioteca de Python couchdb acceder a couchdb. Aquí es un fragmento de código:

server = couchdb.Server() 
db = server['mydb'] 

results = db.view('_design/record_by_date_product/_view/record_by_date_product') 

Esta página http://packages.python.org/CouchDB/client.html#viewresults especifica que podemos utilizar un startkey y endkey. Pero no puedo hacerlo funcionar.

Gracias

Respuesta

5

Creo que acabo de encontrar la respuesta exacta:

Diseño miras 'sampleview', que es como:

{ 
    "records_by_date_product": { 
     "map": "function(doc) {\n emit([doc.prod_id, doc.logtime], doc);\n}" 
    } 
} 

Digamos que los parámetros de consulta son:

prod_id in [1,3] 
from_date = '2010-01-01 00:00:00' 
to_date = '2010-01-02 00:00:00' 

a continuación, tendrá que ejecutar 2 consultas separadas en el mismo punto de vista:

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\["1,2010-01-01%2000:00:00"\]'&endkey='\[1,"2010-01-02%2000:00:00"\]' 

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\[2,"2010-01-01%2000:00:00"\]'&endkey='\[2,"2010-01-02%2000:00:00"\]' 

en cuenta que la misma consulta se ejecuta cada vez que excepto que el prod_id se cambia en la segunda consulta. Los resultados deben cotejarse más tarde. ¡Espero que esto ayude!

+1

Eres solo una persona, ¿verdad? Usted acaba de responder su propia pregunta y dijo "Espero que esto ayude". De todos modos, esto no va a funcionar, porque el orden de las teclas es incorrecto. El rango entre '[start_date, 1]' y '[end_date, 1]' incluirá muchas cosas que no desea, como todo en el rango de fechas para id del producto = 2. Esto * funcionará * si emite la identificación del producto antes de la fecha. –

+0

¡Hehhe! ¡Pensé que esto también ayudaría a otros! :) Tienes razón, tendré que invertir el orden de las teclas y luego consultar la vista. Déjame hacer una edición de la solución. ¡Gracias! –

3

Esa consulta exacta no es posible. Tal como lo sugiere la documentación, puede obtener todo en una vista en un rango de clave particular. Las vistas son estructuras de datos ordenados, por lo que todo lo que CouchDB hace para cumplir esta solicitud es ubicar la tecla de inicio y comenzar a devolver elementos hasta que toque la tecla de finalización.

La estrategia que debe utilizar para esta consulta depende de las características de los propios datos. Lo más importante, va a perder mucho tiempo eliminar a los elementos si se utiliza sólo la primera parte de la clave (logtime) e iterar a través de aquellos en Python, eliminar a los elementos en los que product_id no coincidirán? Si es así, debería considerar escribir otra vista que está principalmente ordenada por product_id. Si no, adelante y use el enfoque de eliminación.

-1

¿Qué hay de esta solución:

  1. puedo crear una vista para cada producto con LogTime que el índice.
  2. Acceso cada vista si es necesario y filtrar theresults utilizando la gama - [todate fromdate]
  3. hacer 3 para cada producto en los parámetros de entrada y cotejar los resultados

esto tiene un inconveniente de que para cada producto que tendrá que crear una vista y esto se ve como un proceso manual.

Es sólo una idea! Déjame saber tus puntos de vista.

+0

Puede ser más simple que eso.Simplemente invierta el orden de las teclas para que los documentos se clasifiquen primero por producto, luego por tiempo de registro. Consulte la misma vista tres veces, buscando cada producto en el rango de tiempo que desee. Esta es la segunda sugerencia en la respuesta que envié, así que si te gusta, márcala como aceptada :) –

+0

Hola, ¿cómo debo "buscar cada producto en el intervalo de tiempo"? Creo que esta es precisamente la pregunta que hice. El hecho es que solo podemos enviar una fecha o un rango [datedate enddate] a una vista. Pero no podemos enviar tanto el rango como la identificación del producto al mismo tiempo. Estoy considerando usar listas que acepten cualquier cantidad de parámetros de consulta. Dará una actualización. ¡Gracias! –

+0

Puede buscar el rango y la identificación del producto al mismo tiempo. Las vistas de CouchDB pueden usar claves compuestas, y usted dio un ejemplo de cómo construir una. Todo lo que tiene que hacer es invertir el orden de su clave para que sea '[doc.product_id, doc.logtime]'. Para consultarlo, use startkeys y endkeys en el mismo formato de dos elementos, según la documentación a la que se vinculó. –

Cuestiones relacionadas