首页 > 解决方案 > Firebase Firestore 和存储:每次读取数据时如何删除数据?

问题描述

我正在制作一个消息传递应用程序。我想构建一个类似于 What's app 的后端。所以我希望数据库(firestore 和 storage)用作缓冲区,即它只保留数据,直到感兴趣的用户阅读消息/文件。我怎样才能聪明地做到这一点?

我有两个想法:

  1. 使用 frebase 云功能,每小时删除一次消息。但这给我带来了两个问题:如果聊天桶有数千个,这个函数要做多少工作?即使该功能向外扩展,它如何与其他与它做同样工作的人协调?另外,我如何告诉它仅在已阅读消息时才删除消息?

  2. 我可能会使用一个:每条消息都有一个发送时间戳。当用户阅读消息时,它同时对时间戳 <= NOW 的所有消息发起删除请求。问题是每个读数都对应一个消除。这个很贵吗?慢吗?此外,如果消息包含对存储的引用(例如音频),我也必须删除它。

有人有更好的策略吗?提前致谢。

标签: firebasegoogle-cloud-firestoregoogle-cloud-functionsfirebase-storagedelete-file

解决方案


Firestore 中没有内置功能可以在读取文档时自动删除它们,因此您必须自己在应用程序逻辑中实现这一点。

最常见的方法是:

  1. 定期运行清理过程,根据每个文档中的时间戳删除过时的内容。您通常会使用计划的 Cloud Function运行它,因为它允许您控制运行多少(以及多久)清理进程。由于您在此处使用时间戳进行查询,因此您阅读的文档数量(因此您支付的费用)与您需要删除的文档数量完全相同。

  2. 对文档实施生存时间,在特定时间段后自动删除它们。您可以为此使用 Cloud Tasks,这意味着您的 Cloud Function 会针对需要删除的每个单独文档触发。这样可以节省您阅读该文档的时间,但会增加添加 Cloud Taskjs 的复杂性。道格·史蒂文森(Doug Stevenson)为此写了一篇很棒的博文:如何安排一个云函数在未来使用云任务运行(构建一个 Firestore 文档 TTL)


推荐阅读