管理索引

仅与 Cloud Firestore 企业版相关。

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

准备工作

如需在具有 MongoDB 兼容性的 Cloud Firestore 中创建索引,您必须分配有以下任一角色:

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

如需授予角色,请参阅授予单个角色。 如需详细了解 Cloud Firestore 角色及相关权限,请参阅预定义角色

如果您定义了自定义角色,则必须为其分配以下所有权限才能创建索引:

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

创建索引

如需创建索引,请完成以下步骤:

MongoDB API

使用 createIndex() 方法创建索引。例如:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • 使用 db.runCommand() 创建索引也受支持,但最多只能创建一个索引。

      db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
      

注意以下限制:

  • 每个请求只能创建一个索引。不支持 db.collection.createIndexes()
  • 使用 MongoDB API 创建索引的审核日志使用方法名称 google.firestore.admin.v1.FirestoreAdmin.CreateIndex
  • 如需了解支持的索引选项,请参阅索引和索引属性
Firebase 控制台
  1. Firebase 控制台中,前往 Firestore 数据库页面。

    前往 Firestore 数据库

  2. 从数据库列表中选择一个数据库。
  3. 索引标签页中,点击创建索引
  4. 输入集合 ID
  5. 添加一个或多个字段路径,并为每个字段路径选择一个索引选项。
  6. 选择字段存在性选项,可以是“非稀疏”或“稀疏”。
  7. 您可以选择设置多键索引选项。
  8. 点击创建
  9. 您的新索引将显示在索引列表中,并且具有 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:要编制索引的字段的名称
  • ORDERASCENDINGDESCENDING
  • DENSITYSPARSE_ANYDENSE

删除索引

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

MongoDB API

使用 dropIndex() 方法删除索引。例如:

使用索引名称删除索引

db.restaurants.dropIndex("cuisine_index")

使用索引定义删除索引

db.restaurants.dropIndex({"cuisine" : 1})
Firebase 控制台
  1. Firebase 控制台中,前往 Firestore 数据库页面。

    前往 Firestore 数据库

  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 兼容的 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

查看操作状态

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

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 字段,则表示操作尚未完成。