Flutter: FirestoreでwhereとorderByを同時に実行したい

プログラミング
スポンサーリンク




こんにちは、おみです。

Flutterで、Firestoreからデータを取得する際、例えば

  • 特定のキーを持つデータを、登録日時の降順で取得する(いわゆる複合クエリ)

という処理を行いたいときがあります。

↓こんな感じのクエリ

FirebaseFirestore.instance.collection("post").where("uid", isEqualTo: user.uid).orderBy("timestamp", descending: true).snapshots()

※複合クエリ…複数のフィールドに対してwhereやorderByを行うこと。フィールドが1種類(今回の場合はuidまたはtimestamp)の場合は、複合クエリではない

 

このクエリを実行し、結果をStreamBuilderで表示しようとすると、データが一瞬表示された後消えてしまいます。

 

今回は、この現象の解決策を解決していきます。

 

スポンサーリンク

原因

Firebaseでは、複合クエリを実行する場合、複合インデックスを作成していないと、データを取得することができません。

 

複合インデックスは、Firestoreの設定画面で簡単に作成できます。

早速やってみましょう。

 

 

作成方法

複合インデックスの追加画面を開く

firebaseでプロジェクトの管理画面を開き、

  1. Cloud Firestore
  2. インデックス
  3. 複合
  4. インデックスを追加

の順にクリックし、インデックスの追加画面を開きます。

 

複合インデックスを追加する

表示されたダイアログに、複合インデックスの情報を記入し、インデックスを作成ボタンをクリックします。

コレクションIDには、複合インデックスを設定するコレクションID(今回であればpost)を記入します。

Flutterのソースコードで、ここで指定したコレクションを読み込もうとすると、複合インデックスを勝手に取得して、読み込みを行ってくれます。

 

フィールドには、複合インデックスで使用するフィールドを入力します。(今回であれば、uidとtimestamp)

こちらも、コレクションIDで指定したコレクション内のフィールドと勝手に紐づいてくれます。

また表示順序の設定ですが、指定した順序での読み込みのみ複合クエリが可能となりますので、今回の場合例えば、timestampを昇順で取得する箇所と降順で取得する箇所両方が存在する場合、timestampをAscendingにしたものとDescendingにしたもの両方を追加する必要があります。

 

これで追加は完了です。

追加した複合インデックスは、指定したコレクションの読み込みを行う際勝手に有効化されるので、ソースコードに複合インデックスに関する情報の追記は不要です。

 

 

コメント

タイトルとURLをコピーしました