web-dev-qa-db-fra.com

Comment combiner l'ordre Firestore Par desc avec startAfter cursor

j'essaye d'interroger une liste dans le magasin de sapins qui devrait être triée par une propriété de date décroissante et utiliser un curseur startAfter pour paginer les résultats.

Comme vous pouvez le voir dans les extraits ci-dessous, cela échoue une fois que je combine orderBy ('date', 'desc') avec startAfter (lastDoc.date).

Je me demande ce que je fais mal. Des idées?

// this actually works
// but it is sorted by ascending dates
db.collection('tanks')
  .doc(tankId)
  .collection('documentations')
  .orderBy('date')
  .startAfter(lastDoc.date)
  .limit(pageSize)
  .get()
  
// this even works...
// but has no cursor (startAfter) set for pagination
db.collection('tanks')
  .doc(tankId)
  .collection('documentations')
  .orderBy('date', 'desc')
  .limit(pageSize)
  .get()
  
// this is what i need
// but it returns always zero results
db.collection('tanks')
  .doc(tankId)
  .collection('documentations')
  .orderBy('date', 'desc')
  .startAfter(lastDoc.date)
  .limit(pageSize)
  .get()
7
user2458046

Vous devez passer l'instantané du document réel à startAfter, pas la valeur de date:

db.collection('tanks')
  .doc(tankId)
  .collection('documentations')
  .orderBy('date', 'desc')
  .startAfter(lastDoc)
  .limit(pageSize)
  .get()

Voir la documentation de référence pour startAfter() .

7
Frank van Puffelen

Cela fonctionne réellement, aucune idée pourquoi cela ne fonctionnait pas avant ...

const snapshot = lastDoc
  ? await Api.db.collection('tanks')
      .doc(tankId)
      .collection('documentations')
      .orderBy('date', 'desc')
      .startAfter(lastDoc.date)
      .limit(pageSize)
      .get()
  : await Api.db.collection('tanks')
      .doc(tankId)
      .collection('documentations')
      .orderBy('date', 'desc')
      .limit(pageSize)
      .get();
4
user2458046