【问题标题】:Deleting very large collections in Firestore在 Firestore 中删除非常大的集合
【发布时间】:2019-01-25 05:08:28
【问题描述】:

我需要在 Firestore 中删除非常大的集合。

最初我使用客户端批量删除,但是当文档发生更改并开始不鼓励使用 cmets 时

不建议从 iOS 客户端删除集合。

不建议从 Web 客户端删除集合。

不建议从 Android 客户端删除集合。

https://firebase.google.com/docs/firestore/manage-data/delete-data?authuser=0

我按照文档中的建议切换到云功能。删除文档时会触发云功能,然后按照“NODE.JS”部分的上述链接中的建议删除子集合中的所有文档。

我现在遇到的问题是云功能似乎能够管理每秒大约 300 次删除。云功能的最大运行时间为 9 分钟,我可以通过这种方式管理多达 162000 次删除。但是我要删除的集合目前有237560个文档,这使得云功能大约一半超时。

我无法在父文档上使用 onDelete 触发器再次触发云函数,因为该函数已被删除(触发了函数的初始调用)。

所以我的问题是:在 Firestore 中删除大型集合的推荐方法是什么?根据文档,它不是客户端而是服务器端,但推荐的解决方案不适用于大型集合。

谢谢!

【问题讨论】:

  • 你有后台吗?使用 let say nodejs admin-firebase 时我没有看到任何限制。
  • 后端是云函数。用户需要能够通过应用删除非常大的集合。

标签: firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

当您有太多的工作可以在单个 Cloud Function 执行中执行时,您需要找到一种方法来跨多个调用分片该工作,或者在第一次调用之后的后续调用中继续工作。这并非小事,您必须考虑并努力为您的特定情况构建最佳解决方案。

对于分片解决方案,您必须提前弄清楚如何拆分文档删除,并让您的主函数启动从属函数(可能通过 pubsub),将参数传递给它以用于确定哪个要删除的分片。例如,您可能会启动一个函数,其唯一目的是删除以“a”开头的文档。另一个是 'b' 等,通过查询它们,然后删除它们。

对于延续解决方案,您可能只是从头开始删除文档,在超时之前尽可能多地执行,记住您停止的位置,然后启动一个从属函数以从先前停止的位置开始。

您应该能够使用其中一种策略来限制每个函数完成的工作量,但实现细节完全取决于您自己制定。

如果由于某种原因,这些策略都不可行,您将不得不管理自己的服务器(可能通过 App Engine),并发送消息(通过 pubsub)它以执行单个长时间运行的工作单元作为响应到云函数。

【讨论】:

  • 感谢您的解释。两个问题:我实际上对客户端删除非常满意。为什么 Firestore 开始不鼓励这样做,并且当我在那里删除集合时,Firebase 控制台本身不使用客户端删除文档?
  • 如果您想讨论控制台的设计,firebase-talk 会比 Stack Overflow cmets 更好。 groups.google.com/forum/#!forum/firebase-talk
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2018-03-22
  • 2019-04-13
  • 2021-08-27
相关资源
最近更新 更多