在Firestore中删除非常大的收藏集

时间:2018-08-18 10:19:25

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

我需要删除Firestore中的非常大的收藏集。

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

  

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

     

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

     

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

     

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

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

当您无法在单个Cloud Function执行中执行的工作太糟糕时,您将需要找到一种方法将这些工作分片到多个调用中,或者在第一个调用之后的后续调用中继续进行。这并非易事,您必须投入一些思考和工作,以针对您的特定情况构建最佳解决方案。

对于分片解决方案,您将必须弄清楚如何提前拆分文档中的删除项,并让主函数启动从属函数(可能是通过pubsub),然后将其传递给参数以找出哪个分片删除。例如,您可能启动了一个函数的唯一目的是删除以“ a”开头的文档。另一个带有“ b”的名称,依此类推,例如查询它们,然后将其删除。

对于延续解决方案,您可能只是从头开始删除文档,在超时之前要花尽可能长的时间,记住您离开的地方,然后启动一个从属函数来获取上一个停止的地方。< / p>

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

如果由于某种原因,这两种策略均不可行,则您将不得不管理自己的服务器(可能通过App Engine),并通过pubsub消息(通过pubsub)来执行一个长期运行的单元来响应到云功能。

相关问题