Firebase Summit のすべての発表内容に目を通し、Firebase を活用してアプリ開発を加速し、自信を持ってアプリを実行できる方法をご確認ください。 詳細

CloudFirestoreでインデックスを管理する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Cloud Firestore は、すべてのクエリにインデックスを要求することで、クエリのパフォーマンスを保証します。最も基本的なクエリに必要なインデックスは、自動的に作成されます。アプリを使用してテストすると、アプリに必要な追加のインデックスを作成するのに役立つエラー メッセージが Cloud Firestore によって生成されます。このページでは、単一フィールドインデックスと複合インデックスを管理する方法について説明します。

エラー メッセージから不足しているインデックスを作成する

既存のインデックスにマップされていない範囲句を使用して複合クエリを実行しようとすると、エラーが発生します。エラー メッセージには、Firebase コンソールで不足しているインデックスを作成するための直接リンクが含まれています。

生成された Firebase コンソールへのリンクをたどり、自動的に入力された情報を確認して、 [作成] をクリックします。

Firebase コンソールを使用する

Firebase コンソールから新しいインデックスを手動で作成するには:

firebase コンソールの firestore インデックス作成インターフェースの画像

  1. Firebase コンソールCloud Firestoreセクションに移動します。
  2. [インデックス] タブに移動し、[インデックスの追加] をクリックします。
  3. コレクション名を入力し、インデックスを並べ替えるフィールドを設定します。
  4. [作成]をクリックします。

クエリのサイズによっては、インデックスの作成に数分かかる場合があります。インデックスを作成すると、複合インデックス セクションでインデックスとそのステータスを確認できます。まだビルド中の場合は、Firebase コンソールにビルド ステータス バーが表示されます。

インデックスを削除

索引を削除するには:

  1. Firebase コンソールCloud Firestoreセクションに移動します。
  2. [インデックス] タブをクリックします。
  3. 削除するインデックスにカーソルを合わせ、コンテキスト メニューから [削除]を選択します。
  4. アラートから [削除]をクリックして、削除することを確認します。

Firebase CLI を使用する

Firebase CLIを使用してインデックスをデプロイすることもできます。開始するには、プロジェクト ディレクトリでfirebase init firestoreを実行します。セットアップ中に、Firebase CLI は正しい形式のデフォルト インデックスを含む JSON ファイルを生成します。ファイルを編集してインデックスを追加し、 firebase deployコマンドでデプロイします。インデックスのみをデプロイする場合は、 --only firestore:indexesフラグを追加します。 Firebase コンソールを使用してインデックスを編集する場合は、必ずローカル インデックス ファイルも更新してください。 JSON インデックス定義リファレンスを参照してください。

索引作成時間

インデックスを作成するには、Cloud Firestore でインデックスを設定してから、インデックスに既存のデータをバックフィルする必要があります。インデックスの構築時間は、セットアップ時間とバックフィル時間の合計です。

  • インデックスの設定には数分かかります。空のデータベースであっても、インデックスの最小構築時間は数分です。

  • バックフィル時間は、新しいインデックスに属する既存のデータの量によって異なります。インデックス定義に一致するフィールド値が多いほど、インデックスのバックフィルにかかる時間が長くなります。

インデックスの作成は長時間実行される操作です。

インデックスの構築を開始すると、Cloud Firestore はオペレーションに一意の名前を割り当てます。オペレーション名には、 projects/[PROJECT_ID]/databases/(default)/operations/というプレフィックスが付きます。次に例を示します。

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

ただし、 describeコマンドのオペレーション名を指定するときは、プレフィックスを省略できます。

すべての長時間実行オペレーションの一覧表示

長時間実行オペレーションを一覧表示するには、 gcloud firestore operations listコマンドを使用します。このコマンドは、進行中の操作と最近完了した操作を一覧表示します。操作は、完了後数日間表示されます。

gcloud firestore operations list

稼働状況を確認する

すべての長時間実行オペレーションをリストする代わりに、1 つのオペレーションの詳細をリストできます。

gcloud firestore operations describe operation-name

完了時間の見積もり

操作の実行中、操作の全体的なステータスについてはstateフィールドの値を参照してください。

長時間実行オペレーションのステータスをリクエストすると、メトリクスworkEstimatedおよびworkCompletedも返されます。これらのメトリックは、ドキュメントの数に対して返されます。 workEstimatedは、オペレーションが処理するドキュメントの推定総数を示します。 workCompletedは、これまでに処理されたドキュメントの数を示します。操作が完了すると、 workCompletedは実際に処理されたドキュメントの総数を反映します。これは、 workEstimatedの値とは異なる場合があります。

作業を分割するworkCompletedの進捗見積もりのworkEstimatedで完了します。統計収集の遅延に依存するため、見積もりが不正確になる可能性があります。

たとえば、インデックス作成の進行状況は次のとおりです。

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressDocuments": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

操作が完了すると、操作の説明に"done": trueが含まれます。操作の結果については、 stateフィールドの値を参照してください。応答でdoneフィールドが設定されていない場合、その値はfalseです。進行中の操作のdone値の存在に依存しないでください。

インデックス構築エラー

複合インデックスおよび単一フィールド インデックスの除外を管理しているときに、インデックス作成エラーが発生する場合があります。 Cloud Firestore がインデックスを作成しているデータに問題が発生した場合、インデックス作成操作は失敗する可能性があります。ほとんどの場合、これはインデックス制限に達したことを意味します。たとえば、操作がドキュメントあたりのインデックス エントリの最大数に達した可能性があります。

インデックスの作成に失敗すると、コンソールにエラー メッセージが表示されます。インデックスの制限に達していないことを確認したら、インデックス操作を再試行してください。