0
votes

Pagination Firestore par offset

Je voudrais créer deux requêtes, avec option de pagination. Sur le premier, je voudrais obtenir les dix premiers enregistrements et le second, je voudrais obtenir les autres tous les enregistrements:

.startAt(0)
.limit(10)

.startAt(9)
.limit(null)

Quelqu'un peut-il confirmer que le code ci-dessus est correct pour les deux conditions?


2 commentaires

Recevez-vous un message d'erreur lors de son utilisation?


Non, je ne l'ai pas encore testé. Je veux juste être sûr que la position du curseur commence à 0 à startAt et aussi passer null à limit.


3 Réponses :


1
votes

Firestore ne prend pas en charge la pagination basée sur l'index ou le décalage. Votre requête ne fonctionnera pas avec ces valeurs.

Veuillez lire attentivement la documentation sur la pagination . La pagination nécessite que vous fournissiez une référence de document (ou des valeurs de champ dans ce document) qui définissent la page suivante à interroger. Cela signifie que votre pagination commencera généralement au début des résultats de la requête, puis progressera à travers eux en utilisant le dernier document que vous voyez dans la page précédente.


1 commentaires

Bonjour Doug, pendant que je faisais des recherches sur le même sujet, j'ai trouvé le document ci-dessous qui montre un exemple d'utilisation de l'offset dans Firestore admin pour ignorer des documents: googleapis.dev/nodejs/firestore/latest/… . Dois-je bien comprendre qu'il est déjà disponible et je me demande s'il est acceptable de l'utiliser? Je suppose que j'ai vu quelque part que l'offset lira toujours chaque document en premier pour calculer le document "de départ" entraînant des frais supplémentaires et qu'il est conseillé d'utiliser un DocumentSnapshot pour paginer de toute façon. Merci de votre contribution à ce sujet.



0
votes

Comme Doug l'a mentionné, Firestore ne prend pas en charge Index / offset - MAIS vous pouvez obtenir des effets similaires en utilisant des combinaisons de ce qu'il prend fait en charge.

Firestore a son propre ordre de tri interne (généralement le document.id), mais toute requête peut être triée .orderBy (), et le premier document sera relatif à ce tri - seule une requête orderBy () a un concept réel de position "0".

Firestore vous permet également de limiter le nombre de documents renvoyés .limit (n)

.endAt (), .endBefore (), .startAt (), .startBefore () all besoin soit d'un objet des mêmes champs que le orderBy, ou d'un DocumentSnapshot - PAS un index

quoi Je ferais est de créer une requête:

MyOrderedQuery.startAfter(ArrayOfDocumentSnapshots[n-1]).limit(n).get() // page forward
MyOrderedQuery.endBefore(ArrayOfDocumentSnapshots[0]).limit(n).get() // page back

Ensuite, exécutez d'abord

MyOrderedQuery.startAfter(ArrayOfDocumentSnapshots[n-1]).onSnapshot()

ou p >

MyOrderedQuery.startAfter(ArrayOfDocumentSnapshots[n-1]).get()

qui renverra dans un sens ou dans l'autre un QuerySnapshot, qui contiendra un tableau des DocumentSnapshots. Sauvegardons ce tableau

let ArrayOfDocumentSnapshots = QuerySnapshot.docs;

Attention Will Robinson! les paramètres javascript sont généralement par référence, et même avec un opérateur de diffusion assez superficiel - assurez-vous que votre code effectivement copie la structure profonde complète ou que la référence est conservée!

Ensuite, pour obtenir le "reste" des documents comme vous le demandez ci-dessus, je ferais:

MyOrderedQuery.limit(n).get().onSnapshot()

ou

MyOrderedQuery.limit(n).get()

qui démarrera APRÈS le dernier instantané de document renvoyé de la PREMIÈRE requête. Notez la réutilisation de MyOrderedQuery

Vous pouvez obtenir quelque chose comme une "pagination" en enregistrant la requête ordonnée comme ci-dessus, puis utiliser à plusieurs reprises l'instantané retourné et la requête d'origine

const MyOrderedQuery = FirebaseInstance.collection().orderBy()

Cela rend votre gestion d'état plus complexe - vous devez vous en tenir à la requête ordonnée, et au dernier QuerySnapshot renvoyé - mais bon, maintenant vous sont en train de paginer.

GRANDE NOTE

Ce n'est pas très efficace - configurer un auditeur est assez "coûteux" pour Firestore, donc vous ne le faites pas veux le faire souvent. En fonction de la (des) taille (s) de votre document, vous pouvez vouloir «écouter» de plus grandes sections de vos collections et gérer une plus grande partie de la pagination localement (Redux ou autre) - La documentation Firestore indique que vous voulez vos écouteurs environ au moins 30 secondes pour plus d'efficacité. Pour certaines applications, même des pages de 10 peuvent être efficaces; pour d'autres, vous devrez peut-être 500 ou plus stockés localement et paginés dans des mandrins plus petits.


0 commentaires

-1
votes

De CollectionReference :

offset(offset) → {Query}

Spécifie le décalage des résultats renvoyés.


1 commentaires

@ pawello2222 merci d'avoir rendu ma réponse plus complète.