管理索引

本页面介绍了如何管理索引。如需详细了解索引,请参阅索引概览

准备工作

您必须分配有以下任一角色,然后才能在具有 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. 添加一个或多个字段路径,并为每个字段路径选择一个索引选项。
  7. 选择字段存在性选项,可以是“非稀疏”或“稀疏”。
  8. (可选)设置多键索引选项。
  9. 点击创建
  10. 您的新索引将显示在索引列表中,并且具有 MongoDB 兼容性的 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 标志。

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:要编制索引的字段的名称
  • ORDERASCENDINGDESCENDING
  • DENSITYSPARSE_ANYDENSE

删除索引

如需删除索引,请完成以下步骤:

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

查看操作状态

您可以列出单个长时间运行的操作的详细信息,而不是列出所有长时间运行的操作:

gcloud firestore operations describe operation-name

估计完成时间

操作运行时,查看 state 字段的值可了解操作的总体状态。

用于获取长时间运行的操作的状态的请求也会返回指标 workEstimatedworkCompletedworkEstimated 表示操作将处理的预估文档总数。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 字段,则表示操作尚未完成。