如何使用Cloud Firestore对“聊天”应用程序的聊天频道进行排序

时间:2019-12-27 15:20:23

标签: firebase google-cloud-firestore

我正在使用Cloud Firestore设计聊天应用程序,其架构如下所示:

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

/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 来以某种方式显示第一个聊天屏幕还是有其他出路?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果要通过一个查询对集合中的文档进行排序,则只能使用该集合中的文档。您无法“联接”其他集合中的其他文档来更改查询结果。因此,现在的方式是必须“重复写入”时间戳。这样的数据复制在NoSQL类型数据库中非常普遍。

答案 1 :(得分:1)

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

因此,您有两种选择:

  1. lastMessageSentTime写入聊天室文档,并在每次为该聊天室编写消息时对其进行更新。那是你目前的建议。

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

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

相关问题