获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

在 Cloud Firestore 中管理索引

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Cloud Firestore 通过要求每个查询都有一个索引来确保查询性能。最基本查询所需的索引会自动为您创建。在您使用和测试应用时,Cloud Firestore 会生成错误消息,帮助您创建应用所需的额外索引。本页介绍如何管理您的单字段索引和复合索引。

通过报错信息创建缺失索引

如果您尝试使用未映射到现有索引的范围子句进行复合查询,则会收到错误消息。错误消息包含一个直接链接,用于在 Firebase 控制台中创建缺失的索引。

按照生成的链接访问 Firebase 控制台,查看自动填充的信息,然后单击创建

使用 Firebase 控制台

要从 Firebase 控制台手动创建新索引:

firebase 控制台中 firestore 索引界面的图像

  1. 转到Firebase 控制台Cloud Firestore部分。
  2. 转到Indexes选项卡并单击Add Index
  3. 输入集合名称并设置要作为索引排序依据的字段。
  4. 单击创建

建立索引可能需要几分钟时间,具体取决于查询的大小。创建它们后,您可以在“综合索引”部分查看您的索引及其状态。如果他们仍在构建,Firebase 控制台会包含一个构建状态栏。

删除索引

要删除索引:

  1. 转到Firebase 控制台Cloud Firestore部分。
  2. 单击索引选项卡。
  3. 将鼠标悬停在要删除的索引上,然后从上下文菜单中选择删除
  4. 通过单击警报中的删除确认您要删除它。

使用 Firebase CLI

您还可以使用Firebase CLI部署索引。首先,在您的项目目录中运行firebase init firestore 。在设置过程中,Firebase CLI 会生成一个 JSON 文件,其中包含格式正确的默认索引。编辑该文件以添加更多索引并使用firebase deploy命令进行部署。如果您只想部署索引,请添加--only firestore:indexes标志。如果您使用 Firebase 控制台对索引进行编辑,请确保您还更新了本地索引文件。请参阅JSON 索引定义参考

索引建立时间

要构建索引,Cloud Firestore 必须设置索引,然后使用现有数据回填索引。索引构建时间是设置时间和回填时间的总和:

  • 设置索引需要几分钟时间。索引的最短构建时间为几分钟,即使对于空数据库也是如此。

  • 回填时间取决于多少现有数据属于新索引。与索引定义匹配的字段值越多,回填索引所需的时间就越长。

索引构建是长时间运行的操作

在您开始构建索引后,Cloud Firestore 会为该操作分配一个唯一的名称。操作名称以projects/[PROJECT_ID]/databases/(default)/operations/为前缀,例如:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

但是,您可以在为describe命令指定操作名称时省略前缀。

列出所有长时间运行的操作

要列出长时间运行的操作,请使用gcloud firestore operations list命令。此命令列出正在进行的和最近完成的操作。操作在完成后列出几天:

gcloud firestore operations list

检查运行状态

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

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字段,则其值为false 。不要依赖于正在进行的操作的done值的存在。

索引构建错误

在管理复合索引和单字段索引豁免时,您可能会遇到索引构建错误。如果 Cloud Firestore 索引的数据遇到问题,索引操作可能会失败。最常见的是,这意味着您达到了索引限制。例如,操作可能已达到每个文档的最大索引条目数。

如果索引创建失败,您会在控制台中看到错误消息。在确认没有达到任何索引限制后,重试索引操作。