我需要删除Firestore中的非常大的收藏集。
最初,我使用客户端批量删除,但是当文档更改并开始不鼓励使用注释时
不建议从iOS客户端删除收藏集。
不建议从Web客户端删除集合。
不建议从Android客户端删除集合。
https://firebase.google.com/docs/firestore/manage-data/delete-data?authuser=0
我按照文档中的建议切换到了云功能。删除文档后会触发云功能,然后按照“ NODE.JS”部分中以上链接的建议删除子集合中的所有文档。
我现在遇到的问题是云功能似乎能够每秒处理约300次删除。使用云功能的最长运行时间为9分钟,我可以通过这种方式管理多达162000个删除操作。但是我要删除的集合当前包含237560个文档,这使云功能超时大约是一半。
我无法在父文档上使用onDelete触发器再次触发云功能,因为该文档已被删除(触发了函数的初始调用)。
所以我的问题是:在Firestore中删除大型集合的推荐方法是什么?根据文档,它不是客户端,而是服务器端,但是推荐的解决方案不适用于大型馆藏。
谢谢!
答案 0 :(得分:0)
当您无法在单个Cloud Function执行中执行的工作太糟糕时,您将需要找到一种方法将这些工作分片到多个调用中,或者在第一个调用之后的后续调用中继续进行。这并非易事,您必须投入一些思考和工作,以针对您的特定情况构建最佳解决方案。
对于分片解决方案,您将必须弄清楚如何提前拆分文档中的删除项,并让主函数启动从属函数(可能是通过pubsub),然后将其传递给参数以找出哪个分片删除。例如,您可能启动了一个函数的唯一目的是删除以“ a”开头的文档。另一个带有“ b”的名称,依此类推,例如查询它们,然后将其删除。
对于延续解决方案,您可能只是从头开始删除文档,在超时之前要花尽可能长的时间,记住您离开的地方,然后启动一个从属函数来获取上一个停止的地方。< / p>
您应该能够使用其中一种策略来限制每个功能完成的工作量,但是实现细节完全取决于您自己制定。
如果由于某种原因,这两种策略均不可行,则您将不得不管理自己的服务器(可能通过App Engine),并通过pubsub消息(通过pubsub)来执行一个长期运行的单元来响应到云功能。