| Cloud Firestore Enterprise エディションにのみ関連します。 |
このページでは、インデックスを管理する方法について説明します。インデックスの詳細については、インデックスの概要をご覧ください。
始める前に
MongoDB 互換の Cloud Firestore でインデックスを作成する前に、次のいずれかのロールが割り当てられていることを確認してください。
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
ロールを付与するには、単一のロールを付与するをご覧ください。 ロールと関連する権限の詳細については、Cloud Firestore事前定義されたロールをご覧ください。
カスタムロールを定義している場合、インデックスを作成するには次のすべての権限を割り当ててください。
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
インデックスの作成
インデックスを作成するには、次の操作を行います。
MongoDB API
createIndex() メソッドを使用してインスタンスを作成します。次に例を示します。
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
db.runCommand()を使用したインデックス作成も、最大 1 つのインデックスでサポートされています。db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
次の制約があります。
- リクエストごとに作成できるインデックスは 1 つだけです。
db.collection.createIndexes()はサポートされていません。 - MongoDB API を使用したインデックス作成の監査ログでは、メソッド名
google.firestore.admin.v1.FirestoreAdmin.CreateIndexが使用されます。 - サポートされているインデックス オプションについては、インデックスとインデックス プロパティをご覧ください。
Firebase コンソール
-
Firebase コンソールで、[Firestore データベース] ページに移動します。
- データベースのリストからデータベースを選択します。
- [インデックス] タブで、[インデックスを作成] をクリックします。
- コレクション ID を入力します。
- 1 つ以上のフィールドパスを追加し、それぞれにインデックス オプションを選択します。
- フィールド プレゼンス オプション(非スパースまたはスパース)を選択します。
- 必要に応じて、マルチキー インデックス オプションを設定できます。
- [作成] をクリックします。
- 新しいインデックスがインデックスのリストに表示され、MongoDB 互換の Cloud Firestore がインデックスの作成を開始します。インデックスが作成されると、インデックスの横に緑色のチェックマークが表示されます。インデックスが作成されていない場合は、考えられる原因をインデックス構築エラーで確認してください。
gcloud CLI
インデックスを作成するには、gcloud firestore indexes composite create コマンドを使用します。api-scope を mongodb-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 フラグを追加します。
一意のインデックスを作成するには、--unique フラグを追加します。
Terraform
google_firestore_index リソースを使用して、api_scope を MONGODB_COMPATIBLE_API に、query_scope を COLLECTION_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_ANY、DENSEのいずれか
インデックスを削除する
インデックスを削除するには、次の操作を行います。
MongoDB API
dropIndex() メソッドを使用して、インデックスを削除します。次に例を示します。
インデックス名を使用してインデックスを削除する
db.restaurants.dropIndex("cuisine_index")
インデックス定義を使用してインデックスを削除する
db.restaurants.dropIndex({"cuisine" : 1})
Firebase コンソール
-
Firebase コンソールで、[Firestore データベース] ページに移動します。
- データベースのリストからデータベースを選択します。
- [インデックス] タブをクリックします。
- インデックスのリストで、削除するインデックスの [その他] ボタン から [削除] を選択します。
- [インデックスを削除] をクリックします。
gcloud CLI
インデックスの名前を確認するには、
gcloud firestore indexes composite listコマンドを使用します。gcloud firestore indexes composite list \ --database='DATABASE_ID'
DATABASE_ID をデータベース ID に置き換えます。
-
インデックスを削除するには、
gcloud firestore indexes composite deleteコマンドを使用します。gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
以下を置き換えます。
- INDEX_NAME: インデックスの名前
- DATABASE_ID: データベース ID
インデックスの構築時間
インデックスを構築するには、MongoDB 互換の Cloud Firestore でインデックスを作成し、既存のデータでインデックス エントリをバックフィルする必要があります。インデックスの作成に必要な時間は、次の要素によって決まります。
インデックスの最小構築時間は、空のデータベースであっても数分です。
インデックス エントリのバックフィルに必要な時間は、新しいインデックスに既存のデータがどの程度存在するかによって異なります。インデックス定義に一致するフィールド値が多いほど、インデックス エントリのバックフィルにかかる時間が長くなります。
長時間実行オペレーションを管理する
インデックスの構築は長時間実行オペレーションになります。 以降のセクションでは、インデックスの長時間実行オペレーションを操作する方法について説明します。
インデックスの作成を開始すると、MongoDB 互換の Cloud 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 フィールドの値で、オペレーション全体のステータスが確認できます。
長時間実行オペレーションのステータスをリクエストすると、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 フィールドがレスポンスに設定されていない場合、オペレーションは完了していません。