47 votes

Pagination dans CouchDB?

Comment dois-je procéder pour mettre en œuvre les requêtes requises pour la pagination?

Fondamentalement, lorsque la page 1 est demandée, obtenez les 5 premières entrées. Pour la page 2, obtenez les 5 suivants et ainsi de suite.

Je prévois de l'utiliser via le module couchdb-python, mais cela ne devrait faire aucune différence pour la mise en œuvre.

36voto

AlexChaffee Points 2979

Le CouchDB Guide a une bonne discussion de la pagination, y compris beaucoup d'exemples de code, ici: http://guide.couchdb.org/draft/recipes.html#pagination Voici leur algorithme:

  • Demande rows_per_page + 1 des lignes de la vue
  • Affichage rows_per_page lignes, boutique de la dernière ligne comme next_startkey
  • Comme les informations sur la page, gardez startkey et next_startkey
  • Utiliser l' next_* valeurs pour créer le lien suivant, et utiliser les autres pour créer du lien précédent

N. B.: Le bon moyen de récupérer les pages de CouchDB est en spécifiant une clé de départ, pas un indice de départ comme vous pourriez le penser. Mais comment savez-vous quelle touche pour démarrer la 2ème page sur? La solution intelligente: "au Lieu de demander de 10 lignes pour une page, vous demande de 11 lignes, mais l'affichage de seulement 10 et utiliser les valeurs dans le 11e de ligne comme le startkey pour la page suivante."

Si vous vous attendez à avoir plusieurs documents émettent des clés identiques, vous aurez besoin d'utiliser startdocid de plus de startkey pour paginer correctement. La raison en est qu' startkey seront les seuls à ne plus être suffisante pour identifier de manière unique une ligne. Ces paramètres sont inutiles si vous ne fournissez pas un startkey. En fait, CouchDB va d'abord chercher à l' startkey paramètre, puis il va utiliser l' startdocid paramètre pour de plus amples redéfinir le début de la plage si plusieurs potentiels de regarder les lignes ont la même clé, mais différents Id de document. Même chose pour l' enddocid.

13voto

kerrr Points 2015

Le CouchDB HTTP API d'Affichage donne beaucoup de possibilités pour faire de la pagination de manière efficace.

La méthode la plus simple serait d'utiliser startkey et count. Nombre est le nombre maximum des entrées de CouchDB sera de retour pour que la vue de la demande, quelque chose qui est à votre design, et startkey est l'endroit où vous voulez CouchDB pour commencer. Lorsque vous demandez la vue, il sera également vous dire combien d'entrées il y a, vous permettant de calculer le nombre de pages, il y aura, si vous voulez montrer que pour les utilisateurs.

Donc, la première demande ne serait pas spécifier un startkey, juste le nombre pour le nombre d'entrées que vous souhaitez afficher. Vous pouvez alors noter la clé de la dernière entrée est retourné et l'utiliser comme clé de début de la page suivante. Dans ce simple formulaire, vous recevrez un chevauchement, où la dernière entrée d'une page est le premier de la suivante. Si ce n'est pas souhaitable, il est trivial tout simplement de ne pas afficher le dernier élément de la page.

Une méthode plus simple de le faire est d'utiliser le paramètre skip pour travailler sur le document de départ pour la page, mais cette méthode doit être utilisée avec prudence. Le paramètre skip simplement causes du moteur interne de ne pas retourner les entrées qu'il est à parcourir. Tout cela donne le comportement souhaité, il est beaucoup plus lent que de trouver le premier document de la page par la touche. Plus le nombre de documents qui sont ignorés, le ralentissement de la demande sera.

3voto

cpinto Points 51

Il y a cette bibliothèque d’utilitaires sur github.com qui vous abstrait du travail de pagination: http://github.com/cpinto/python-couchdb-paginator/tree/master

1voto

dbr Points 66401

C'est ce que je suis venu avec à ce jour - pour obtenir les identifiants de tous les postes, puis de récupérer les articles réels pour les x premiers Identifiants..

Il n'est pas très efficace, mais plus que la récupération de tous les postes, puis de jeter la plupart de la distance. Cela dit, à ma grande surprise, il semblait courir assez rapidement - j'ai couru à l' posthelper.page() méthode 100 fois et il a fallu environ 0,5 secondes.

Je ne voulais pas poster cela dans le libellé de la question, de sorte qu'il ne serait pas influencer les réponses, que - voici le code:

allPostsUuid = """
function(doc) {
if(doc.type == 'post'){
    emit(doc._id, null);
}
}
"""

class PostsHelper:
    def __init__(self):
        server = Server(config.dbhost)
        db = server[config.dbname]
        return db


    def _getPostByUuid(self, uuid):
        return self.db.get(uuid)

    def page(self, number = 1):
        number -= 1 # start at zero offset
        start = number * config.perPage
        end = start + config.perPage

        allUuids = [
            x.key for x in self.db.query(allPostsUuid)
        ]
        ret = [
            self._getPostByUuid(x) for x in allUuids[start : end]
        ]

        if len(ret) == 0:
            raise Error404("Invalid page (%s results)" % (len(allUuids)))
        else:
            return ret

0voto

Santos Points 59

Il est possible que je sois à la première page et que je passe à la page 3? Parce que si je n'ai pas demandé la page 2, je n'ai pas le premier identifiant de la page 3.

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