2011-08-12 4 views
5

En utilisant MySQL serait:CouchDB, obtenez 10 derniers documents

SELECT * FROM thetable ORDER BY id DESC LIMIT 10 

Comment puis-je faire dans CouchDB pour tous les documents avec "type": "message"? (Sans tirer tous les documents de type: message)

Merci

Répondre

9

Créer une vue qui émet tous les doc ids. Les touches de vue seront utilisées pour le tri automatique.

function(doc) { 
    if(doc.type && doc.type === 'message'){ 
     emit(doc._id, null); 
    } 
} 

Ensuite, exécutez une requête: http://host/yourdb/_design/yourdesigndoc/_view/viewname?limit=10&include_docs=true&descending=true

Parce que vous voulez que le document, nous n'inclus quoi que ce soit en tant que valeur dans la vue. Au lieu de cela, nous ajoutons include_docs=true pour récupérer chaque document complet pour les entrées d'affichage.

Notez qu'il existe également une vue builtin qui fait la même: http://host/yourdb/_all_docs?limit=10&include_docs=true&descending=true

PS: Vous devez être conscient du fait que CouchDB utilise par défaut UUID comme ID, ce qui rend le tri plus ou moins inutiles, si vous voulez vraiment obtenir les derniers documents. Indiquez vos propres identifiants incrémentiels (qu'en est-il de la distribution/réplication?) Ou utilisez un nouveau champ qui enregistre l'heure à laquelle le document a été créé et utilisé dans la vue.


Si vos documents ont un champ created (à savoir timestamp UNIX, JavaScript Date.now() ou même une RFC chaîne 3339-like), vous pouvez construire un index sur ces valeurs.

est ici le point de vue temporel:

function(doc) { 
    if(doc.type && doc.type === 'message' && doc.created){ 
     emit(doc.created, null); 
    } 
} 

Notez que nous n'émettre le doc._id lui-même. Cependant, CouchDB stocke les doc._id où les données proviennent automatiquement pour chaque paire clé/valeur émise, de sorte que nous pouvons à nouveau utiliser include_docs=true pour récupérer les documents complets.

Recherche http://host/yourdb/_design/yourdesigndoc/_view/viewname?limit=10&include_docs=true&descending=true

+0

Merci pour la réponse. Cependant, cela retournera les 10 documents les plus anciens contenant le type: message. J'ai besoin des 10 nouveaux documents. La seule façon dont je peux penser à faire ceci est de tirer chaque identifiant de document, en prenant les 10 derniers identifiants de ce jeu de résultats, puis en appelant les documents directement avec les identifiants ... Ca ne me semble pas être la bonne façon de faire il. – Brian

+0

Avez-vous lu mon PS? Cela dépend de la façon dont vos doc._ids sont générés/assignés. Peut-être que vous devez passer à 'descending = false' ou même ajouter un champ généré à vos documents et l'utiliser. –

+0

wow non ce n'est pas, je jure que je dois avoir essayé cela 100 fois haha ​​... aucune idée où je l'ai foiré. Merci! – Brian

3

Si les ID de vos documents sont déjà supplémentaires, au lieu des UUID par défaut de CouchDB, vous ne même pas besoin de définir une vue, vous pouvez simplement utiliser la valeur par défaut _all_docs vue, par exemple

http://couchdb_host/your_db/_all_docs?limit=10&descending=true&include_docs=true 
Questions connexes