管理索引
本页面介绍了如何管理索引。如需详细了解索引,请参阅索引概览。
准备工作
您必须分配有以下任一角色,然后才能在具有 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 控制台
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
标志。
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
删除索引
如需删除索引,请完成以下步骤:
Google Cloud 控制台
-
在 Google Cloud 控制台中,前往数据库页面。
- 从数据库列表中选择一个数据库。
- 在导航菜单中,点击索引。
- 在索引列表中,针对要删除的索引,从更多按钮 中选择删除。
- 点击删除索引。
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 兼容的 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
查看操作状态
您可以列出单个长时间运行的操作的详细信息,而不是列出所有长时间运行的操作:
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
字段,则表示操作尚未完成。