【问题标题】:Listen to multiple sub-collections - Firebase Flutter收听多个子集合 - Firebase Flutter
【发布时间】:2021-10-30 11:08:26
【问题描述】:

我的数据库结构为:

=> collection (ChatRoom) : stores chat room name, chat participants, unique chat room id
 => documents (unique ids) : documents created with unique ids based upon users
  => sub-collection (chats) : all chats going on between 2 specified persons (chat participants)

现在,我想根据用户收听多个聊天集合。 例如:

如果用户与 500 人建立联系,那么我如何收听那些 500 条聊天(子集合),以便在其中任何人发送新消息时得到通知。

另外,这不会对设备造成很大的性能开销

另外,考虑到这种情况下的 db 读取,它们会不会太多。

这种情况最好的方法应该是什么?

【问题讨论】:

标签: firebase flutter google-cloud-firestore


【解决方案1】:

没有办法收听自定义的子集合集。

您的选择是:

  • 通过为每个子集合附加一个侦听器来侦听特定的 chats 子集合。
  • collection group query收听所有chats(子)收藏。
  • 您可以使用this trick 在数据库中的特定路径收听chats 子集合。

另一种方法是为每个用户创建他们应该看到的数据的集合。这意味着您将需要在多个位置编写聊天,但随后读取特定用户的数据会变得更加容易。在使用 NoSQL 数据库时,这种交易写入复杂性以实现更轻松、更具可扩展性的读取非常常见。

【讨论】:

  • 我想在 .where 条件后收听聊天子集合。这可能吗?
  • 想法是收听那些仅针对指定用户(参与该聊天的用户)的聊天(子集合)。
  • 没有。您必须执行查询,然后为每个结果附加一个单独的侦听器。
  • 这种情况下的性能开销如何?如果一个用户参与了 500 个聊天(子集合)并且我为所有这些人附加了 500 个侦听器,那会不会很糟糕?
  • 为每个用户收听数百个集合不是一个可扩展的解决方案。并且您使用的 API 不存在,正是因为如果 Firestore SDK 或服务器必须这样做,它也无法扩展。概述的方法是最常见的。我还建议阅读 NoSQL data modeling 并观看 Getting to know Cloud Firestore,因为您的担忧似乎与一般的 NoSQL 数据建模更相关。
【解决方案2】:

这就是推送通知/数据消息的用途。 当有新消息发生时,您会向用户的设备发送数据通知,并告诉它获取该特定聊天记录。

【讨论】:

    【解决方案3】:

    所以,经过长时间的研究,谷歌推荐的快照监听器的限制是 100。

    参考:Multiple streams to firebase documents without disposing

    Gabriel 的建议似乎是正确的。当来自特定用户的新消息到达时,我们可以开始将侦听器附加到该特定聊天。感谢Frank的帮助和建议。

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 2022-06-30
      • 2022-01-19
      • 2020-08-28
      • 2021-03-05
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多