5 votes

Comment interroger une vue couchdb à l'aide d'une clé composite ?

J'ai une vue couchdb "record_by_date_product" avec la définition suivante :

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

J'essaie d'exécuter une requête qui ressemble à quelque chose comme :

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

Est-ce possible avec cette vue ?

J'utilise également la bibliothèque python couchdb pour accéder à couchdb. Voici un extrait de code :

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

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

Cette page http://packages.python.org/CouchDB/client.html#viewresults précise que nous pouvons utiliser une clé de départ et une clé d'arrivée. Mais je ne parviens pas à le faire fonctionner.

Remerciements

5voto

Sreedhar Gundappa Points 119

Je pense que je viens de trouver la réponse exacte :

Concevoir une vue 'sampleview' qui ressemble à :

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

Disons que les paramètres de la requête sont les suivants :

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

Vous devrez alors exécuter deux requêtes distinctes sur la même vue :

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"\]'

Remarquez que la même requête est exécutée à chaque fois, sauf que le prod_id est modifié dans la deuxième requête. Les résultats doivent être regroupés ultérieurement. J'espère que cela vous aidera !

3voto

Brian Goldman Points 531

Cette requête exacte n'est pas possible. Comme le suggère la documentation, vous pouvez obtenir tout ce qui se trouve dans une vue dans un intervalle de clés particulier. Les vues sont des structures de données triées, donc tout ce que CouchDB fait pour répondre à cette requête est de localiser la clé de départ et de commencer à renvoyer des éléments jusqu'à ce que vous atteigniez la clé de fin.

La stratégie à adopter pour cette requête dépend des caractéristiques des données elles-mêmes. Plus important encore, perdrez-vous beaucoup de temps à éliminer des éléments si vous n'utilisez que la première partie de la clé ( logtime ) et les parcourir en Python, en éliminant les éléments pour lesquels product_id ne correspond pas ? Si c'est le cas, vous devriez envisager d'écrire une autre vue qui est principalement triée par product_id . Si ce n'est pas le cas, continuez à utiliser l'approche du désherbage.

-1voto

Sreedhar Gundappa Points 119

Que pensez-vous de cette solution ?

  1. Je crée une vue pour chaque produit avec logtime comme index.
  2. Accédez à chaque vue si nécessaire et filtrez les résultats en utilisant l'intervalle - [de la date à la date].
  3. Faites-en trois pour chaque produit dans les paramètres d'entrée et rassemblez les résultats.

L'inconvénient est que, pour chaque produit, nous devrons créer une vue, ce qui semble être un processus manuel.

C'est juste une idée ! Faites-moi part de votre avis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X