¿Hay alguna manera de implementar la paginación inversa con firestore? Estoy luchando por implementar la paginación con firestore, y hay consultas limitadas de firestore para ello. La paginación hacia adelante se puede hacer mediante el método startAt y limit , eso está bien. Pero la paginación inversa no se puede hacer fácilmente, porque solo tenemos el método endBefore y endAt , y cómo podemos obtener los últimos elementos n de documento dado? Sé que la base de datos en tiempo real tiene el método limitToLast . ¿Hay alguna consulta como esta para firestore? (También necesito implementar una clasificación múltiple, por lo que no funcionará obtener los últimos documentos con la clasificación "ASC" o "DESC") Ayuda muy apreciada.

¡Gracias!

4
Tiago Romao 19 ene. 2018 a las 16:44

3 respuestas

La mejor respuesta

El equivalente a la operación limitToLast(...) de Firebase Realtime Database en Cloud Firestore es ordenar que los datos desciendan (que es posible en Firestore) y luego simplemente limit(...). Si tiene problemas para implementar esto, actualice su pregunta para mostrar lo que ha hecho.

Estoy de acuerdo en que esta es una API subóptima para la paginación inversa, ya que está recibiendo los artículos en orden inverso.

6
Frank van Puffelen 19 ene. 2018 a las 15:06

Si. Sobre la base de la respuesta de Frank ...

Tiene algo como esto en su consulta ...

    if (this.next) {
      // if next, orderBy field descending, start after last field
      q.orderBy('field', 'desc');
      q.startAfter(this.marker);
    } else if (this.prev) {
      // if prev, orderBy field ascending, start after first field
      q.orderBy('field', 'asc');
      q.startAfter(this.marker);
    } else {
      // otherwise just display first page results normally
      q.orderBy('field', 'desc');
    }
    q.limit(this.pageSize);

Y luego revertirlo cuando obtenga la consulta ...

    this.testsCollection
            .valueChanges({ idField: 'id' })
            .pipe(
              tap(results => {
                if (this.prev) {
                  // if previous, need to reverse the results...
                  results.reverse();
                }
              })
            )
0
Jonathan 15 mar. 2020 a las 23:20

Me encontraba con este mismo problema y no entendía por qué usar limit con endAt no me devolvía los resultados que deseaba. Intentaba implementar una lista en la que podía paginar en ambas direcciones, primero hacia adelante y luego hacia atrás al comienzo de la lista.

Para remediar la situación, decidí guardar en caché el startAfter DocumentSnapshot para cada página para que uno pueda moverse en ambas direcciones, de esta manera nunca tendré que usar endAt. El único momento en que esto se convertirá en un problema es si la colección de documentos cambia o cambia mientras el usuario se encuentra en una página que no es la primera página, pero al regresar a la primera página se restablecerá al comienzo de la colección.

0
Gabe O'Leary 17 dic. 2019 a las 17:13