【问题标题】:How to sort chat channels for Chat app using Cloud firestore如何使用 Cloud Firestore 对聊天应用程序的聊天频道进行排序
【发布时间】:2020-04-17 12:57:45
【问题描述】:

我正在使用 Cloud Firestore 设计一个聊天应用程序,架构看起来像这样:

每个 1:1 聊天都是在 chats 集合中创建的。每个 chats 集合都有一组字段和一个子集合。每个子集合将包含所有消息。它看起来像这样 -

/chats

* id (auto gen)
* channel ( string type - sort(uid1 , uid2) )
* uid1
* uid2
* createdTime
* lastMessageSentTime
* messages (sub collection) 
    * fromUid
    * toUid
    * content
    * sendTime

为了显示初始聊天屏幕,其中包含与用户聊天的所有用户,我查询 /chats 集合并按 lastMessageSentTime 对结果进行排序。

我看到这个设计的一个问题是我需要为每条发送或接收的消息更新 lastMessageSentTime。有什么办法可以避免这种重复写吗?

我可以使用 messages 子集合的 sendTime 以某种方式显示第一个聊天屏幕还是有其他方法?

提前致谢!

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    无法根据messages 子集合中的值查询顶级chats 集合。

    所以你有两个选择:

    1. lastMessageSentTime 写入聊天室文档,并在每次为该聊天室编写消息时更新它。这是你目前的提议。

    2. 确定读取数据的正确顺序。因此,您首先加载所有聊天室,然后加载每个聊天室的最新消息。

    不熟悉 NoSQL 数据库的开发人员通常从第二个选项开始,而更有经验的 NoSQL 开发人员通常会选择第一个选项,因为它会带来更简单和可扩展的读取操作。

    【讨论】:

    • 如果我为每个用户保留单独的聊天室,并且我必须为每个发送的消息更新每个聊天室数据两次以显示 lastSeen。
    【解决方案2】:

    如果您想使用一个查询对集合中的文档进行排序,则只能使用该集合中的文档。您不能“加入”其他集合中的其他文档来更改查询结果。因此,按照您现在的方式,您必须“双重写入”时间戳。像这样复制数据在 NoSQL 类型的数据库中非常常见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      相关资源
      最近更新 更多