我有一个带有嵌套子集合的 Firestore 结构,如下所示:
- 项目
- 访问
- 观察 → 可以引用 Firebase 存储中的图像
- 访问
所以我有以下用例:
<强>1。当我删除观察时,我需要从存储中删除关联的图像。
- 这是通过使用云函数来完成的triggered using onDelete .
<强>2。当我删除访问时,我需要删除其所有观察及其各自的图像。
- 我在 Flutter 客户端中通过获取所有文档来完成此操作,iterate and delete them one by one .
<强>3。当我删除一个项目时,我需要删除它的所有访问,然后删除它的所有观察及其各自的图像。
- 我也在客户端中执行此操作,迭代所有结构(获取所有访问,然后获取所有观察结果......)。
我知道解决客户端中的用例 2 和 3并不是一个好主意基于 Firebase 团队建议的选项,因此应该使用 Cloud Functions 来解决,对吧?
根据official documentation可以删除集合及其所有子集合 using firebase_tools.firestore.delete但我认为这个解决方案不能满足用例1,我是对的吗? (我也在使用 firebase_tools will lag a lot 阅读该内容)。
另一个选择可能是在云端进行迭代并删除其中的每个项目。
我没有太多使用 Firebase 的经验,所以我真的不知道解决此问题的最佳方法是什么...
提前致谢!
最佳答案
如当前文档中所述,不建议从客户端删除。然而,这种说法有点绝对,确实需要澄清;它非常依赖于用例。
Firebase 的总体情况:
There is no single operation in the API to delete an entire collection. Instead a collection comes into existence once a first document is added to it, and a collection disappears once the final document is deleted from it.
因此,通过客户端删除是可能的,有时也是一种解决方案
但是,清楚地了解其后果非常重要。有很多,但这里有一些需要考虑:
删除集合需要删除文档。在某些情况下,这意味着下载所有文档以获取其路径,这可能会压垮设备。
除此之外,大量下载可能会增加成本,并可能影响用户体验。
说清楚
删除集合是可以的,但根据集合的大小可能无法很好地扩展
例如如果您需要删除包含 10 个文档且无法扩展的集合,没问题。但如果该集合扩展到 100 万个文档,那就是不同的用例并具有不同的解决方案。
回到问题:
- When I delete an Observation I need to remove the associated image from the Storage.
这里的关键是“观察”,意思是 1。是的,从客户端删除它是完全可以接受的,因为“1”很好...“1”并且无法扩展。
- When I delete a Visit I need to delete all it's Observations and their respective images.
这取决于用例:到目前为止,您正在获取所有文档并通过迭代进行删除。这是应该避免的,因为它不会随着文档数量的开放而扩展...但是...如果您将访问限制为 100,那么它就不会扩展超过该数量,因此从客户端删除是可以的。如果没有限制,那么从云函数中删除是可行的方法。
- When I delete a Project I need to delete all it's Visits, then all it's Observations and their respective images.
这实际上取决于您为项目中的数据设置的限制。如果限制为 X 个文档并且 X 是一个合理的数量,那么从客户端删除是可以的。但是,如果没有限制,利用云功能是最好的选择。
没有理由不能将两者结合起来。对于1,从客户端删除。对于2和3,如果数据可以扩展到很大数量,可以通过云函数删除。
话虽如此,云函数也有局限性 - 调用可能需要一段时间,因此如果正在运行客户端查询,您最终可能会得到碎片数据。此外,您无法控制所需的时间长度,因此可能会超时,然后您会处于一种奇怪的状态,有些内容被删除,有些内容没有删除。最后,基于云的删除不是事务性的,因此有些数据可能会被删除,有些可能不会。这种情况应该非常罕见,但潜力是存在的。
关于firebase - 在 Firestore 中删除集合和子集合的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68963127/