批量删除数据

您可以使用 Firestore 代管式批量删除服务从数据库中删除数据。此功能支持针对一个或多个集合组进行删除。

本页介绍了如何使用托管式批量删除服务批量删除 Firestore 文档。可通过 gcloud 命令行工具和 Firestore API (RESTRPC) 使用 Firestore 代管式批量删除服务。

准备工作

您必须先完成以下任务,才能使用托管式批量删除服务:

  1. 为 Google Cloud 项目启用结算功能。只有启用了结算功能的 Google Cloud 项目才能使用批量删除功能。
  2. 确保您的账号拥有 Firestore 的必要权限。如果您是项目所有者,那么您的账号具有所需权限。如果不是,以下角色具有必要的批量删除操作权限:

    • Firestore 角色OwnerCloud Datastore OwnerCloud Datastore Bulk Admin

为您的项目设置 gcloud

您可以通过 Google Cloud 控制台或 gcloud 命令行工具启动批量删除操作。如需使用 gcloud,请设置命令行工具并通过以下任一方式连接到您的项目:

批量删除数据

批量删除操作会先查找数据库中的所有适用文档,然后批量删除这些文档。您仍然可以查询或阅读这些文档,但结果可能会因处理进度而异。批量删除不会删除操作开始后添加或修改的任何文档。

批量删除特定集合组

gcloud

如需批量删除特定集合组,请使用 --collection-ids 标志。该操作仅删除具有指定 ID 的集合组。集合组包括具有指定集合组的所有文档和嵌套文档(在任意路径)。

gcloud beta firestore bulk-delete \
--collection-ids=[COLLECTION_GROUP_ID_1_OR_KIND_1],[COLLECTION_GROUP_ID_2_OR_KIND_2],[SUBCOLLECTION_GROUP_ID_1_OR_KIND_3] \
--database=[DATABASE]
例如,假设 cymbal 数据库的顶级 restaurants 集合中包含多个代表餐厅的文档。在每条餐厅文档下,都有多个嵌套的子集合,例如 ratingsreviewsoutlets。如需批量删除 restaurantsreviews 集合组,您的命令应如下所示:

gcloud beta firestore bulk-delete \
--collection-ids=restaurants,reviews \
--database='cymbal'

管理批量删除操作

在您启动批量删除操作后,Firestore 会为操作分配唯一的名称。您可以使用操作名称来删除、取消操作或检查操作状态。

操作名称的前缀为 projects/[PROJECT_ID]/databases/[DATABASE_ID]/operations/,例如:

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

不过,您可以在指定 describecanceldelete 命令的操作名称时省略前缀。

列出所有批量删除操作

gcloud

使用 operations list 命令查看所有正在运行和最近完成的操作,包括批量删除操作:

gcloud firestore operations list

查看操作状态

gcloud

使用 operations describe 命令显示批量删除操作的状态。

gcloud firestore operations describe [OPERATION_NAME]

预估完成时间

用于获取运行时间较长的操作状态的请求会返回指标 workEstimatedworkCompleted。返回的这两个指标均包含字节数和文档数:

  • workEstimated 表示操作将处理的预估总字节数和文档数。如果 Firestore 无法进行估算,则可能会省略该指标。

  • workCompleted 表示目前已删除的字节数和文档数。 操作完成后,该值会显示实际处理的总字节数和总文档数,可能大于 workEstimated 的值。

workCompleted 除以 workEstimated 可得出粗略的进度估算值。该估算值可能不准确,因为它所依据的是延迟的统计信息收集操作。

取消操作

gcloud

使用 operations cancel 命令可停止正在进行的操作:

gcloud firestore operations cancel [OPERATION_NAME]

取消正在进行的操作并不会撤消操作。取消批量删除操作后,系统不会恢复已删除的文档。

删除操作

使用 gcloud firestore operations delete 命令可从最近操作列表中移除已完成的操作。如需取消正在运行的操作,请使用之前的取消操作。

gcloud firestore operations delete [OPERATION_NAME]

批量删除操作的结算和价格

在使用托管式批量删除服务前,您需要为 Google Cloud 项目启用结算功能。

对于批量删除操作,您需按 Firestore 价格中列出的费率支付文档读取和删除费用。批量删除操作会对每个找到的文档执行一次索引条目读取操作,并对每个删除的文档执行一次删除操作。对于读取的最多 1,000 个索引条目,系统都会收取相当于一次读取操作的费用。例如,如果批量删除操作删除了 1500 个文档,则系统会收取相当于两次文档读取和 1500 次文档删除的费用。

请注意,Firestore 会根据实际完成的工作收费。如果操作因用户错误而被取消或失败,我们将根据已完成的进度向您收费。对于最终未被删除的文档(例如,在删除操作开始后被修改的文档),Firestore 不会收取读取或删除费用。费用将在操作完成的当天收取。

批量删除操作在完成之前不会触发 Google Cloud 预算提醒。同样,在批量删除操作期间执行的读取和删除操作会在操作完成后计入您的可用配额/用量。批量删除操作不会影响控制台的用量部分中显示的用量。

查看批量删除费用

批量删除操作会为结算操作添加 goog-firestoremanaged:bulkdelete 标签。在 Cloud Billing 报告页面中,您可以使用此标签查看与批量删除操作相关的费用。

最佳做法

避免跳过已删除的数据,因为这可能会导致查询速度变慢。