web-dev-qa-db-ja.com

Firestore orderBy descとstartAfterカーソルを組み合わせる方法

降順の日付プロパティで並べ替える必要があるfirestoreのリストをクエリし、startAfterカーソルを使用して結果をページ分割しようとしています。

以下のスニペットでわかるように、orderBy( '​​date'、 'desc')とstartAfter(lastDoc.date)を組み合わせると、これは失敗します。

私は何を間違っているのだろうと思っています。何か案は?

// 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

実際のドキュメントのスナップショットを日付値ではなくstartAfterに渡す必要があります。

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

startAfter() のリファレンスドキュメントを参照してください。

7

これは実際に機能していますが、なぜ以前は機能しなかったのかはわかりません...

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