首页 > 解决方案 > 如何使用 Firebase 云数据库支持聊天室中的新消息?

问题描述

我有一个关于数据库建模的问题。我正在为我的 Android 应用程序使用 Firebase Cloud 数据库,并且我有一个名为chatRooms. 该集合中的每个文档都包含以下字段:

  1. 聊天室名称。
  2. 聊天室图片。
  3. 在聊天室中发送的最后一条消息(在 中创建新文档后由 firebase 函数触发messages)。
  4. 最后一条消息的时间戳(也由 firebase 函数创建)。
  5. 用户 - 该聊天室中数据库中的用户路径列表(到他们的文档)。

每个文档还指向另一个集合messages,其中的每个文档都包含:

  1. 信息。
  2. 消息发送者的姓名。
  3. 发件人文档在数据库中的路径。
  4. 消息的时间戳。

我想添加对“seen”选项的支持,这意味着我想知道我在聊天室中是否有新消息。如果我进入我所有聊天室的屏幕,我想知道是否有一个我没见过的聊天室,然后我可以“加粗”聊天室(或做其他事情来表明用户有该聊天室中的新消息)。起初我想在chatRooms关卡中创建一个数组,其中包含所有看到最新消息的用户。但我认为这可能会导致竞争条件,因为运行 firebase 函数需要时间。在数据库中支持“新消息”的最佳方式是什么?我想听听数据库建模建议(例如,保留哪个字段以及在哪里处理它)。

标签: databasefirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


最简单的方法是跟踪每个用户在每个聊天室中看到的最新消息的时间戳。您可以在客户端代码中执行此操作,无论是在为聊天室加载数据时,还是在屏幕上显示一条消息时,例如if (msg.timestamp > user["last_seen."+room_id]) userDocRef.update("last_seen."+room_id, msg.timestamp).

然后,为了确定哪些聊天室有新消息,您将该聊天室的最后更新时间戳与该聊天室用户的最后显示时间戳进行比较。

我会将这些值作为地图存储在用户的文档中:$chatroomid: timestamp. 这样,当用户文档被删除时,数据将自动被清理,它具有与用户文档的其余部分一致的访问控制,并且您似乎不太可能想要查询用户的单个房间时间戳或那些将超出文档的 1MB 大小限制。


推荐阅读