2020-09-02

firestoreのindexを自動で管理する

Firestoreを利用している場合に、悩ましいのが増えていくインデックスの管理です。

単一フィールドのみを利用したクエリ(例えばIDで検索とか)であれば、自動的に作成される単一フィールドインデックス でまかなえます。 ただ、実際にアプリや管理画面等を作成していると、様々な条件でクエリを実行するケースが増えてくるため、その場合複合インデックスを追加していく必要があります。

アプリからインデックスがない状態でクエリを実行すると、以下のようなエラーが出ます。

Uncaught (in promise) FirebaseError: The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/xxxxxxxxxx/firestore/indexes?create_composite=xxxxxxxxxx

このリンクにアクセスすると以下のような画面が表示され、ここからインデックスを作成することができます。

ただ毎回画面から手動で作ってしまうと、dev環境・production環境等のように複数のfirebaseプロジェクトを使っている場合、別の環境にまたに手動でインデックス設定を移さないといけなくなります。

ですのでこの画面から作成するのではなくインデックス定義用のjsonファイルを置いておき、firebase CLI を使って更新するのがおすすめです。

firestore.indexes.json のようなJSONファイルをプロジェクト内に配置します。フォーマットは以下のようになります。

{
  "indexes": [
    {
      "collectionGroup": "collectionName",
      "queryScope": "COLLECTION",
      "fields": [
        {
          "fieldPath": "field1",
          "order": "ASCENDING"
        },
        {
          "fieldPath": "field2",
          "order": "DESCENDING"
        }
      ]
    }
  ]
}

もしも、既にコンソール画面から追加したインデックスがある場合は、以下のコマンドでインデックスファイルのフォーマットを出力することができます。

firebase firestore:indexes

firebase CLIからデプロイする際にインデックスファイルの場所がわかるように、firebase.jsonに以下のように定義します。

{
  "firestore": {
    "indexes": "./firestore.indexes.json"
  }
}

以下のコマンドを実行するとインデックスがデプロイされます。

firebase deploy --only firestore:rules

このようにしておけば別の環境にインデックスを反映させる場合もコマンド一発で済みます。

インデックスが10, 20とかどんどん増えていった場合に手動で行っていると管理できなくなってくるので、このようにコードで定義しておいて自動で更新する方法がおすすめです。

最終更新: 2021-09-18 08:00
筆者: @gaishimo 主にReact Nativeでのアプリ開発を行っています。
© 2021 Omoidasu, Inc. All rights reserved.