【问题标题】:How to listen for changes(or get stream) from nested sub collections?如何从嵌套子集合中侦听更改(或获取流)?
【发布时间】:2021-02-16 11:02:25
【问题描述】:

我正在为我的应用构建私人聊天功能。我选择 Firestore 作为我的后端,下面是聊天线程和消息的结构。

privateChats - chatId1 - chatId1 - messageId1, messageId2,...

collection - document - collection - documents

这里是截图

我想要实现的是获取每个聊天线程(chatId1,chatId2,...)的快照及其相应的消息(最后一个文档/消息已发送)并显示如下 - 请参阅聊天屏幕

我尝试过类似的方法 databaseRef.collection('privateChats').where('chatId', whereIn: chatList).snapshots(); 然而,从上面的快照返回的流只监听 createdAt 字段存在的字段的变化。

这给了我一个唯一的选择来为每个聊天线程获取单独的快照 databaseRef.collection('privateChats').doc('chatId1).collection('chatId1).snapshots(); databaseRef.collection('privateChats').doc('chatId2).collection('chatId2).snapshots(); 并以某种方式将这些快照组合成单个流(我不知道如何)

所以我的问题是 - 在给定聊天 ID 列表时,有没有办法通过一个查询来获取每个聊天线程的快照?如果没有,有什么解决办法?我应该想出不同的云火库结构吗? 谢谢

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    我认为您可以为每个聊天室创建一个文档 ..就像说 databaseRef.collection('privateChats').doc('chatId1+chatId2') 那么用户 id1 和 id2 都只能访问该文档

    【讨论】:

    • 您好,感谢您的回答。我没有真正明白你的意思。你能再澄清一下吗?
    • 是的,它目前的结构与您描述的一样,但与databaseRef.collection('privateChats').doc('usertId1-userId2') 几乎没有什么不同,换句话说userId1-userId2 代表chatId1
    • 我说的是不是听两个流,您可以通过为每个聊天室(显然由两个用户组成)创建一个文档来使其成为一个,例如 `databaseRef.collection(' privateChats').doc('chatId1+chatId2') ` 其中chatId1 是第一个用户的id,chatId2 是第二个用户的id。我希望你现在能够理解
    • 我想要实现的是,假设一个用户有 10 个聊天会话(每个会话与不同的用户)。我希望能够收听所有 10 个聊天会话。
    • 然后查看 rxdart 包。它有你需要的东西
    【解决方案2】:

    我按照 emir adejuwon 的建议使用 rxdart MergeStream 函数解决了我的问题

    【讨论】:

    • 如果提供的答案有助于将其标记为已接受,这将有助于其他社区成员
    • 是的,我知道该政策,我全心全意地支持它。但是提供的实际答案没有帮助。对此的评论很有帮助。所以我赞成唯一的评论
    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2021-08-20
    • 2020-07-17
    相关资源
    最近更新 更多