Database 如何使用Firebase云数据库支持聊天室中的新消息?

Database 如何使用Firebase云数据库支持聊天室中的新消息?,database,firebase,google-cloud-firestore,google-cloud-functions,Database,Firebase,Google Cloud Firestore,Google Cloud Functions,我有一个关于数据库建模的问题。我正在为我的Android应用程序使用Firebase云数据库,我有一个名为聊天室的集合。该集合中的每个文档都包含以下字段: 聊天室名称 聊天室图像 在聊天室中发送的最后一条消息(在消息中创建新文档后由firebase函数触发) 最后一条消息的时间戳(也由firebase函数创建) 用户-数据库中位于该聊天室中的用户路径列表(指向其文档) 每个文档还指向另一个集合消息,其中的每个文档都包含: 信息 邮件发件人的名称 数据库中发件人文档的路径 消息的时间戳 我想添加对

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

  • 聊天室名称
  • 聊天室图像
  • 在聊天室中发送的最后一条消息(在
    消息
    中创建新文档后由firebase函数触发)
  • 最后一条消息的时间戳(也由firebase函数创建)
  • 用户-数据库中位于该聊天室中的用户路径列表(指向其文档)
  • 每个文档还指向另一个集合
    消息
    ,其中的每个文档都包含:

  • 信息
  • 邮件发件人的名称
  • 数据库中发件人文档的路径
  • 消息的时间戳

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

    最简单的方法是跟踪每个用户在每个聊天室中看到的最新消息的时间戳。您可以在客户端代码中这样做,当加载聊天室的数据时,或者当屏幕上显示消息时,使用类似于
    if(msg.timestamp>user[“last_seed.”+room_id])userDocRef.update(“last_seed.”+room_id,msg.timestamp)的东西

    然后,要确定哪些聊天室有新消息,请将该聊天室的上次更新时间戳与该聊天室用户的上次更新时间戳进行比较

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