2009-05-08 8 views
3

Je suis en train d'écrire une vue CouchDB qui prend un horodatage created_at dans un format sortable (2009/05/07 21:40:17 +0000) et retourne tous les documents qui ont une plus grande valeur created_at. J'utilise spécifiquement couch_foo mais si je peux comprendre comment écrire la vue, je peux la créer dans le futon ou dans le modèle couch_foo au lieu de laisser couch_foo le faire pour moi.Vues CouchDB: created_at supérieure à une valeur passée

J'ai cherché tout autour et ne peux pas comprendre la carte/réduire pour ce faire, si c'est possible.

Répondre

3

Vous voulez écrire une vue qui crée une clé du champ d'horodatage dans ce format, puis requête avec le paramètre startkey.

donc la vue ressemblerait à quelque chose comme:

"map" : "function(doc) { emit(doc.timestamp_field, doc) }" 

Et votre URL serait quelque chose comme:

http://mysever/database/_design/mydoc/_view/myview?startkey="2009/05/07 21:40:17 +0000" 

La page HTTP view API sur le Wiki a plus d'informations. Vous pouvez également considérer le User Mailing List.

1

Veuillez noter que couchdb ne fonctionne que sur les valeurs json. Si le fuseau horaire si le document stocké dans couchdb est différent du fuseau horaire de votre startkey, la requête échouera probablement.

4

C'est le genre de problème que j'ai rencontré dans un premier temps avant de comprendre complètement le fonctionnement des vues. La clé de compréhension est que la vue n'est exécutée qu'une fois pour chaque (révision) d'un document. En d'autres termes, lorsque vous interrogez une vue, vous n'exécutez pas la fonction, vous recherchez simplement les résultats de l'exécution de la fonction. En tant que tel, il n'y a aucun moyen de transmettre des paramètres soumis par l'utilisateur dans une vue. Comment comparer une valeur dans une vue avec une valeur soumise par l'utilisateur?

Le secret est d'émettre ce champ en tant que clé dans la fonction de la carte et de faire en sorte que la commande couchdb soit activée par les touches.

Votre fonction carte serait quelque chose comme

"map" : "function(doc) { emit(doc.created_at, doc); }" 

et que vous souhaitez l'interroger comme ceci:

http://localhost:5984/db/_design/ddoc/_view/view?startkey=%222009/05/07%2021:40:17 +0000%22 

J'ai pris la liberté de URIEncoding les citations et les espaces dans l'URL afin qu'il devrait être utilisable tel quel.