La Pagination dans CouchDB?
Comment pourrais-je aller sur la mise en œuvre les requêtes nécessaires pour la pagination?
En gros, quand la page 1 est demandée, obtenir les 5 premières entrées. Pour la page 2, le 5 et ainsi de suite.
J'ai l'intention d'utiliser ce par le biais de la couchdb-module python, mais qui ne devrait pas faire de différence à la mise en œuvre.
Vous devez vous connecter pour publier un commentaire.
La 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:
rows_per_page + 1
des lignes de la vuerows_per_page
lignes, boutique de la dernière ligne commenext_startkey
startkey
etnext_startkey
next_*
valeurs pour créer le lien suivant, et utiliser les autres pour créer du lien précédentN. 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
en plus destartkey
pour paginer correctement. La raison en est questartkey
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 unstartkey
. En fait, CouchDB va d'abord regarder lesstartkey
paramètre, puis il va utiliser lastartdocid
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 leenddocid
.push()
ing la page précédente début_id
en un tableau, vous pouvez facilementpop()
le tableau_id
lorsque vous cliquez sur le bouton précédent. À la plupart tout ce que vous avez à faire est de garder la trace de est un tableau d'entiers.La CouchDB HTTP API d'Affichage donne beaucoup de possibilités pour faire de la pagination efficacement.
La méthode la plus simple serait d'utiliser
startkey
etcount
. 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.De sorte que 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.
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 le
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: