database - 如何使用 Firebase 云数据库支持聊天室中的新消息?
问题描述
我有一个关于数据库建模的问题。我正在为我的 Android 应用程序使用 Firebase Cloud 数据库,并且我有一个名为chatRooms
. 该集合中的每个文档都包含以下字段:
- 聊天室名称。
- 聊天室图片。
- 在聊天室中发送的最后一条消息(在 中创建新文档后由 firebase 函数触发
messages
)。 - 最后一条消息的时间戳(也由 firebase 函数创建)。
- 用户 - 该聊天室中数据库中的用户路径列表(到他们的文档)。
每个文档还指向另一个集合messages
,其中的每个文档都包含:
- 信息。
- 消息发送者的姓名。
- 发件人文档在数据库中的路径。
- 消息的时间戳。
我想添加对“seen”选项的支持,这意味着我想知道我在聊天室中是否有新消息。如果我进入我所有聊天室的屏幕,我想知道是否有一个我没见过的聊天室,然后我可以“加粗”聊天室(或做其他事情来表明用户有该聊天室中的新消息)。起初我想在chatRooms
关卡中创建一个数组,其中包含所有看到最新消息的用户。但我认为这可能会导致竞争条件,因为运行 firebase 函数需要时间。在数据库中支持“新消息”的最佳方式是什么?我想听听数据库建模建议(例如,保留哪个字段以及在哪里处理它)。
解决方案
最简单的方法是跟踪每个用户在每个聊天室中看到的最新消息的时间戳。您可以在客户端代码中执行此操作,无论是在为聊天室加载数据时,还是在屏幕上显示一条消息时,例如if (msg.timestamp > user["last_seen."+room_id]) userDocRef.update("last_seen."+room_id, msg.timestamp)
.
然后,为了确定哪些聊天室有新消息,您将该聊天室的最后更新时间戳与该聊天室用户的最后显示时间戳进行比较。
我会将这些值作为地图存储在用户的文档中:$chatroomid: timestamp
. 这样,当用户文档被删除时,数据将自动被清理,它具有与用户文档的其余部分一致的访问控制,并且您似乎不太可能想要查询用户的单个房间时间戳或那些将超出文档的 1MB 大小限制。
推荐阅读
- android - 使用 Firebase 实时数据库检查 Recyclerview 是否为空
- javascript - 如何在 React 中设置 httpOnly cookie?
- html - 如何在网页上定位英雄图像
- excel - 如何使用过滤器数据进行 Vlookup
- mongodb - 如何过滤mongodb聚合中的主数组
- matlab - 从 OpenFace 数据中检测头部点头
- postgresql - 函数内部的循环作为单个事务运行并读取单个快照的数据
- android - Android 自定义操作栏/工具栏/标签栏
- macos - 使用自制软件安装 taurus
- android - 无法使用 Hilt 创建带有构造函数参数的 ViewModel 实例