【问题标题】:What's the best way to delete collections and subcollections on Firestore?删除 Firestore 上的集合和子集合的最佳方法是什么?
【发布时间】:2021-10-27 23:12:36
【问题描述】:

我有一个带有嵌套子集合的 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 函数在后台线程上调用,因此使用通常不会看到任何“滞后”。所以这个问题有点模糊 - 你能澄清一下吗?
  • 这个answer 可能会有所帮助。
  • 谢谢@Jay 我已经读到在客户端中删除它会对安全和性能产生负面影响,但由于我在这个主题上没有太多经验,所以我不能更清楚。我认为 Firebase 团队推荐它,有人告诉我,即使我的代码正常工作,在客户端中执行它也不好。与“滞后很多”相同,我已经阅读了它,我只是想确定我的选择。
  • 感谢@AlexMamo 如果您的收藏量较小,在客户端执行此操作似乎是一个有效的解决方案。
  • 是的,这在文档中有所说明,但为了清楚起见,需要上下文。从客户端删除集合是完全可以接受的。但是,清楚地了解后果很重要;删除集合需要删除文档。在某些情况下,这意味着下载所有文档以获取其路径,这可能会使设备不堪重负。

标签: firebase google-cloud-firestore


【解决方案1】:

您应该使用 Cloud Functions 执行删除操作。

第一个用例没有问题,因为您仍然可以使用 Cloud Functions 删除集合或 Firebase 存储映像。

【讨论】:

  • 这个答案跳到一个可能不正确的结论。在假设 Cloud Functions 是唯一的选择之前,需要更多信息。删除数据是内置在 API 中的,因此仅利用 Cloud Functions 将是情景。我认为这个问题在走这条路之前需要弄清楚。
【解决方案2】:

如当前文档中所述,不建议从客户端删除。但是,该声明有点绝对,确实需要澄清;它非常依赖于用例。

Firebase 的大图:

API 中没有单个操作可以删除整个 收藏。取而代之的是,一个集合首先出现 文档被添加到它,并且一个集合在最终消失后消失 文档已从中删除。

因此,通过客户端删除是可能的,有时也是一种解决方案

但是,清楚地了解后果很重要。有很多,但这里有一些需要考虑:

删除集合需要删除文档。在某些情况下,这意味着下载所有文档以获取其路径,这可能会使设备不堪重负。

除此之外,大量下载可能会增加成本并可能影响用户体验。

说清楚

可以删除集合,但可能无法很好地扩展,具体取决于集合的大小

例如如果您需要删除包含 10 个文档且不会扩展的集合,没问题。但如果该集合扩展到 100 万个文档,那就是不同的用例并有不同的解决方案。

所以回到问题:

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

这里的关键是“观察”,意思是 1。是的,从客户端删除它是完全可以接受的,因为 '1' 很好......'1' 并且不会缩放。

  1. 当我删除访问时,我需要删除它的所有观察及其各自的图像。

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

  1. 当我删除一个项目时,我需要删除它的所有访问,然后是所有的观察和它们各自的图像。

这实际上取决于您为项目中的数据设置的限制。如果它限制为 X 个文档并且 X 是一个合理的数字,那么从客户端删除是可以的。但是,如果没有限制,利用云功能是您的最佳选择。

没有理由不能将两者结合起来。对于 1,从客户端删除。如果数据可以扩展到大量数据,则通过云功能删除 2 和 3。

话虽如此,云功能也有限制 - 调用可能需要一段时间,因此如果有客户端查询正在运行,您最终可能会得到碎片化的数据。此外,您没有状态或控制所需的时间长度,因此可以想象它可能会超时,然后您处于一种奇怪的状态,有些东西被删除,有些东西没有。

最后,基于云的删除不是事务性的,因此有些数据可能会被删除,有些则可能不会。这应该是非常非常罕见的,但潜力是存在的。

【讨论】:

  • 非常感谢杰伊!你说的很有道理
猜你喜欢
  • 2019-03-14
  • 2020-07-09
  • 2020-11-26
  • 2020-02-17
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多