インデックスを管理

このページでは、インデックスの管理方法について説明します。インデックスの詳細については、インデックスの概要をご覧ください。

始める前に

MongoDB 互換の Firestore でインデックスを作成する前に、自身に次のいずれかのロールが割り当てられていることを確認してください。

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

ロールを付与するには、単一のロールを付与するをご覧ください。Firestore のロールと関連する権限の詳細については、事前定義ロールをご覧ください。

カスタムロールを定義している場合、インデックスを作成するには次のすべての権限を割り当ててください。

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

インデックスの作成

インデックスを作成するには、次の操作を行います。

Google Cloud コンソール
  1. Google Cloud コンソールで [データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストからデータベースを選択します。
  3. ナビゲーション メニューで [インデックス] をクリックします。
  4. [インデックスを作成] をクリックします。
  5. コレクション ID を入力します。
  6. 1 つ以上のフィールドパスを追加し、それぞれにインデックス オプションを選択します。
  7. フィールドの存在オプション(非スパースまたはスパース)を選択します。
  8. 必要に応じて、マルチキー インデックス オプションを設定します。
  9. [作成] をクリックします。
  10. 新しいインデックスがインデックスのリストに表示され、MongoDB 互換の Firestore がインデックスの作成を開始します。インデックスが作成されると、インデックスの横に緑色のチェックマークが表示されます。インデックスが作成されない場合は、インデックス構築エラーで考えられる原因を確認してください。
gcloud CLI

インデックスを作成するには、gcloud firestore indexes composite create コマンドを使用します。api-scopemongodb-compatible-api に設定します。

gcloud firestore indexes composite create \
--database='DATABASE_ID' \
--collection-group=COLLECTION \
--field-config=FIELD_CONFIGURATION \
--query-scope=collection-group \
--density=dense \
--api-scope=mongodb-compatible-api

次のように置き換えます。

  • DATABASE_ID: データベース ID。
  • COLLECTION: コレクション名。
  • FIELD_CONFIGURATION: フィールド構成。フィールドごとに --field-config=field-path= を追加します。次に例を示します。
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    これらのフィールドの構成の詳細については、--field-config をご覧ください。

スパース インデックスを作成するには、--density=sparse-any を設定します。

マルチキー インデックスを作成するには、--multikey フラグを追加します。

Terraform

google_firestore_index リソースを使用して、api_scopeMONGODB_COMPATIBLE_API に、query_scopeCOLLECTION_GROUP に設定します。

resource "google_firestore_index" "index" {
  database    = "DATABASE_ID"
  collection  = "COLLECTION"
  api_scope   = "MONGODB_COMPATIBLE_API"
  query_scope = "COLLECTION_GROUP"

  // You can include multiple field blocks
  fields {
    field_path = "FIELD_PATH"
    order      = "ORDER"
  }

  // Optional
  multikey = true
  density  = "DENSITY"
}

次のように置き換えます。

  • DATABASE_ID: 選択したデータベースのデータベース ID
  • COLLECTION: インデックスに登録するコレクションの名前
  • FIELD_PATH: インデックスに登録するフィールドの名前
  • ORDER: ASCENDING または DESCENDING のいずれか
  • DENSITY: SPARSE_ALL または dense のいずれか

インデックスを削除する

インデックスを削除する手順は次のとおりです。

Google Cloud コンソール
  1. Google Cloud コンソールで [データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストからデータベースを選択します。
  3. ナビゲーション メニューで [インデックス] をクリックします。
  4. インデックスのリストで、削除するインデックスのその他ボタン から [削除] を選択します。
  5. [インデックスを削除] をクリックします。
gcloud CLI
  1. インデックスの名前を確認するには、gcloud firestore indexes composite list コマンドを使用します。

    gcloud firestore indexes composite list \
    --database='DATABASE_ID'

    DATABASE_ID をデータベース ID に置き換えます。

  2. インデックスを削除するには、gcloud firestore indexes composite delete コマンドを使用します。

    gcloud firestore indexes composite delete INDEX_NAME \
    --database='DATABASE_ID'

    次のように置き換えます。

    • INDEX_NAME: インデックスの名前
    • DATABASE_ID: データベース ID

インデックスの構築時間

インデックスを構築するには、MongoDB 互換の Firestore でインデックスを作成し、既存のデータでインデックス エントリをバックフィルする必要があります。インデックスの作成に必要な時間は、次の要素によって決まります。

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

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

長時間実行オペレーションを管理する

インデックスの構築は長時間実行オペレーションです。以降のセクションでは、インデックスの長時間実行オペレーションを操作する方法について説明します。

インデックスの作成を開始すると、MongoDB 互換の Firestore によりオペレーションに一意の名前が割り当てられます。次のように、オペレーション名の先頭には projects/PROJECT_ID/databases/DATABASE_ID/operations/ という文字列が付きます。

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

describe コマンド用のオペレーション名を指定するときは、接頭辞を省略できます。

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

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

gcloud firestore operations list

オペレーションのステータスを確認する

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

gcloud firestore operations describe operation-name

完了時間の見積もり

オペレーションを実行すると、state フィールドの値で、オペレーション全体のステータスが確認できます。

長時間実行オペレーションのステータスをリクエストすると、workEstimatedworkCompleted の指標も合わせて返されます。workEstimated には、オペレーションで処理される推定の合計ドキュメント数が表示されます。workCompleted には、これまでに処理されたドキュメント数が表示されます。オペレーションが完了すると、workCompleted には実際に処理されたドキュメントの合計数が反映されます。これは workEstimated の値とは異なる場合があります。

オペレーションの進行状況を推定するには、workCompletedworkEstimated で割ります。

インデックスの作成の進行状況の例を次に示します。

{
  "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 フィールドがレスポンスに設定されていない場合、オペレーションは完了していません。