我正在构建一个聊天应用程序,当聊天组中发送新消息时,该应用程序会推送通知。每个聊天组在聊天组集合中都有自己的文档,每个文档内部都有一个名为消息的集合。我使用云函数来监听消息集合中的更改。当用户添加新文档时,我需要查询聊天组中除发件人之外的所有成员的用户文档以获取设备令牌,以便我可以推送通知。但是,每次有人发送消息时重复此过程会导致令人难以置信的读取量。即使对于小型聊天应用程序,消息数量也很容易攀升到数千条,因此阅读也是如此。
为了省钱,我决定创建文档,在同一文档中存储多个用户令牌,最多 1000 个用户。由于单个文档的大小限制,我将其限制为 1000,但我将彼此相关的用户的设备令牌放在同一个文档中,因为他们可能位于同一个聊天组中。我预计读取次数会大幅减少,因为我只能查询一两个文档来获取大型聊天组中的所有用户令牌,而不是在一个文档中查询一个令牌。虽然这里的一切听起来都不错,但我无法摆脱我的担忧。我想听听您的宝贵意见。这是一种有效的解决方法吗?这里可能存在哪些问题?
在单个文档中存储多个内容是减少文档读取次数的有效方法。您似乎已经考虑了一些因素,但这里还有一些:
- 您将无法有效地查询单个文档中的令牌,因此必须依靠另一种方法来查找所需的文档。您已经以某种方式对它们进行了分组,但要记住这一点。
- 您通常最终会将每个令牌存储在多个文档中。如果您以前从未这样做过,可能会感到有点不舒服,但在处理NoSQL数据库时这是正常的。但是,您将以令牌的多次写入结束:对于它需要的每个聚合文档,一个。
- 由于您只能读取完整的文档,因此您将始终读取所有令牌。如果在某些情况下,聚合文档中需要令牌的子集,则会浪费带宽。
- 您可以考虑使用 Firebase 实时数据库来存储令牌,该数据库没有文档读取的概念,并且仅对令牌使用的存储和带宽收费(以 JSON 为单位(。