将多个设备令牌存储在一个文档中以从云功能中查询

Storing multiple device tokens in one document to query from cloud function

我正在构建一个聊天应用程序,当聊天组中发送新消息时它会推送通知。每个聊天组在聊天组集合中都有自己的文档,每个文档中都有一个名为消息的集合。我使用云函数来监听消息集合中的变化。当用户添加新文档时,我需要查询聊天组中除发送者之外的所有成员的用户文档以获取设备令牌,以便推送通知。但是,每次有人发送消息时都重复此过程会导致令人难以置信的阅读量。即使是小型聊天应用程序,消息数量也可能轻松攀升至数千条,因此阅读量也是如此。

为了省钱,我决定创建文档,将多个用户令牌存储在同一个文档中,最多 1000 个用户。由于单个文档的大小限制,我将它限制为 1000,但我将彼此相关的用户的设备令牌放在同一个文档中,因为他们可能在同一个聊天组中。我预计读取量会大幅减少,因为我只能查询一个或两个文档来获取大型聊天组中的所有用户令牌,而不是为一个令牌查询一个文档。虽然这里一切听起来都很好,但我无法克服自己的担忧。想听听您的宝贵意见。这是一个有效的解决方法吗?这里可能存在哪些问题?

在单个文档中存储多条内容是减少文档读取次数的有效方法。您似乎已经考虑了一些因素,但这里还有一些因素:

  • 您将无法有效地查询单个文档中的标记,因此将不得不依靠另一种方式来查找您需要的文档。您已经以某种方式对它们进行了分组,但请记住这一点。
  • 您通常最终会将每个标记存储在多个文档中。如果你以前从来没有这样做过,可能会觉得有点不舒服,但在处理 NoSQL 数据库时这是正常的。不过,您最终会为一个令牌写入多次:一个用于它需要包含的每个聚合文档。
  • 由于您只能阅读完整的文档,因此您将始终阅读所有令牌。如果在某些情况下您需要聚合文档中的令牌子集,就会浪费带宽。
  • 可以考虑使用Firebase实时数据库来存储token,没有文档读取的概念,只对token使用的存储和带宽收费(in JSON)。