firebase - 在 Firestore 中删除集合和子集合的最佳方法是什么?

标签 firebase google-cloud-firestore

我有一个带有嵌套子集合的 Firestore 结构,如下所示:

  • 项目
    • 访问
      • 观察 → 可以引用 Firebase 存储中的图像

所以我有以下用例:

<强>1。当我删除观察时,我需要从存储中删除关联的图像。

<强>2。当我删除访问时,我需要删除其所有观察及其各自的图像。

<强>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 万个文档,那就是不同的用例并具有不同的解决方案。

回到问题:

  1. When I delete an Observation I need to remove the associated image from the Storage.

这里的关键是“观察”,意思是 1。是的,从客户端删除它是完全可以接受的,因为“1”很好...“1”并且无法扩展。

  1. When I delete a Visit I need to delete all it's Observations and their respective images.

这取决于用例:到目前为止,您正在获取所有文档并通过迭代进行删除。这是应该避免的,因为它不会随着文档数量的开放而扩展...但是...如果您将访问限制为 100,那么它就不会扩展超过该数量,因此从客户端删除是可以的。如果没有限制,那么从云函数中删除是可行的方法。

  1. 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/

相关文章:

node.js - 如何忽略 'firebase-admin appears to have been installed in an unsupported environment.'?

java - Android 中的 Firebase 事件离线和在线日志记录

android - FirebaseAuth Admin 中的这一点是什么意思?

android - Android 中的 Firebase 数据库引用

firebase - 在 Firebase 中将数据保存到子级

javascript - 如何正确从 observable 获取数组数据?

android - 获取 MyFirebaseInstanceIDService 的 Activity 实例

ios - 尝试通过 FirebaseUI Auth 连接 Facebook 登录,但遇到 authUI.delegate = self 问题

javascript - 从 firebase 的 onCall 函数返回 promise 的正确方法?

firebase - Flutter:从 Firestore 延迟加载数据