firebase - 如何使用 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 。有没有办法避免这种双重写作?
我可以使用消息子集合的sendTime以某种方式显示第一个聊天屏幕还是有其他出路?
提前致谢 !
解决方案
无法根据子集合中的值查询顶级chats
集合。messages
所以你有两个选择:
将其
lastMessageSentTime
写入聊天室文档,并在每次为该聊天室编写消息时更新它。这是你目前的提议。确定读取数据的正确顺序。因此,您首先加载所有聊天室,然后加载每个聊天室的最新消息。
不熟悉 NoSQL 数据库的开发人员通常从第二个选项开始,而更有经验的 NoSQL 开发人员通常会选择第一个选项,因为它会导致更简单和可扩展的读取操作。
推荐阅读
- javascript - 浏览器中的 JavaScript 视频:如何通过修改此示例代码来加载 mp4 视频?
- c# - 为什么我的碰撞没有检测到(统一)
- vue.js - [Vue 警告]:渲染错误:“TypeError:无法读取未定义的属性 '”'
- c# - LINQ 内部 WHERE - 内部集合包含字符串
- bash - 在命令参数中注入 bash 条件
- arraylist - 我如何计算 wxmaxima 中列表的成员?
- javascript - Onclick 按钮仅在第一个列表中有效
- azure - Azure WVD 部署域加入失败
- css - React 是否支持内联样式的 cmyk 颜色定义?
- php - 在php中使帖子永久化