【Firebase】Cloud Firestoreでページネーションを実装する

Firebase の Cloud Firestore で保存していたデータを取得する際に、Web ページでよくあるページネーションを実装する方法についてまとめ。
今回初めて知ったのですが、Cloud Firestore でデータを取得する際、limit はあっても offset がないんですね…!
どうやってやればいいのか、ちょっと悩みました。
なお、使用したライブラリは React Native Firebase です。

参考にさせていただいた記事はこちら。

Cloud Firestore でのページネーションの実装 | mokajima.com
https://mokajima.com/how-to-paginate-data-in-cloud-firestore/

 

やり方ですが、limit()startAfter() を合わせて使います。
まず、1回目の 1ページ目を取得する際は、limit() だけを使います。
その後、2回目の 11件から 20件を取得等の処理を行う際には、startAfter() を使って、指定したデータより後ろのデータを 10件分取得するという感じで指定します。

サンプルコードは下記のとおりです。

// 1ページ目のデータ取得
const result = await firestore().collection('コレクション名')
  .orderBy('createdAt', 'desc')
  .limit(10)
  .get();

まず、1ページ目の、先頭データから 10件分のデータを取得する処理です。
この時、一番最後のデータを保存しておきます。

次に、2ページ目以降のデータ取得方法です。
上のサンプルコードで保存しておいた、リスト最後の投稿日時を startAt() に追加します。

// 2ページ目以降のデータ取得
const createdAtEnd = 'リスト最後のデータの投稿日時';

const result = await firestore().collection('コレクション名')
  .orderBy('createdAt', 'desc')
  .startAt(createdAtEnd)
  .limit(10)
  .get();

上記のように記述することで、最後に取得したデータから 10件分というデータのとり方ができます。
なお、データ取得後は、変数 createdAtEnd に保存しているデータを、新しく取得したデータの最後の投稿日時に置き換える必要がありますので、こちらの処理をお忘れなく。
また、startAt() で指定する項目で orderBy() を必ず指定するようにしてください。
処理としては以上です!

最初、offset の指定ができないと聞いた時、どうする…!?と思ったのですが、意外とあっさり対応できてよかったです。

 

以上、React Native Firebase の Cloud Firestoreでページネーションを実装する方法についてでした。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG