消息模块的数据模型设计

目录

一、创建POJO映射类

1. message集合 

2. message_ref集合 

二、MongoDB的联合查询


MessageRef:保存消息接收人相关信息,接收人ID、消息已读未读、消息是否最新接收。

        在 MongoDB 里面我们不需要预先去创建集合,只要我们往 MongoDB 里面保存数据,那么相应的集合就创建出来了。


一、创建POJO映射类

        MongoDB中没有数据表的概念,而是采用集合(Collection)存储数据,每条数据就是一个文档(Document)。文档结构很好理解,其实就是我们常用的JSON,一个JSON就是一条记录。 

1. message集合 

        集合相当于MySQL中的数据表,但是没有固定的表结构。集合有什么字段,取决于保存在其中的数据。下面这张表格是 Message 集合中JSON数据的结构要求。 

        比如说小程序每隔5分钟轮询是否有新的消息,如果积压的消息太多,Java系统没有接收完消息,这时候新的轮询到来,就会产生两个消费者共同接收同一个消息的情况,这会造成数据库中添加了重复的记录,如果每条MQ消息都有唯一的UUID值,第一个消费者把消息保存到数据库,那么第二个消费者就无法再把这条消息保存到数据库,解决了消息的重复消费问题。 

创建 MessageEntity.java 类,映射 message 集合。

@Data
@Document(collection = "message")
public class MessageEntity implements Serializable {@Idprivate String _id;@Indexed(unique = true)private String uuid;@Indexedprivate Integer senderId;private String senderPhoto="https://static-1258386385.cos.ap-beijing.myqcloud.com/img/System.jpg";private String senderName;private String msg;@Indexedprivate Date sendTime;
}

2. message_ref集合 

        虽然 message 集合记录的是消息,里面有接受者ID,但是如果是群发消息,那么接受者ID是空值。这时候就需要用上 message_ref 集合来记录接收人和已读状态。 

 

创建 MessageRefEntity.java 类,映射 message_ref 集合。 

@Data
@Document(collection = "message_ref")
public class MessageRefEntity implements Serializable {@Idprivate String _id;@Indexedprivate String messageId;@Indexedprivate Integer receiverId;@Indexedprivate Boolean readFlag;@Indexedprivate Boolean lastFlag;
}

二、MongoDB的联合查询

        MongoDB从3.X开始支持集合的连接查询,也就相当于MySQL的表连接。我们先要向MongoDB中添加记录,于是 message 和 message_ref 两个集合就都创建出来了。 

db.message.insert( {_id: ObjectId("600bea9ab5bafb311f147506"),uuid:"bfcb7c47-5886-c528-5127-ce285bc2322a",senderId: 0,senderPhoto: "https://static-1258386385.cos.ap-beijing.myqcloud.com/img/System.jpg",senderName: "Emos系统",msg: "HelloWorld",sendTime: ISODate("2021-01-23T17:21:30Z") } );db.message_ref.insert( {_id: ObjectId("600beaf0d6310000830036f3"),messageId: "600bea9ab5bafb311f147506", receiverId: 1,readFlag: false,lastFlag: true
} );

        执行两个集合的联合查询,根据接收人来查询消息,并且按照消息发送时间降序排列,查询前50 条记录

db.message.aggregate([{$set: {"id": { $toString: "$_id" }}},{$lookup:{from:"message_ref",localField:"id",foreignField:"messageId",as:"ref"},},{$match:{"ref.receiverId": 1}},{$sort: {sendTime : -1}},{$skip: 0 },{ $limit: 50 }
])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/2354.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型基础之注意力机制和Transformer

【注意力机制】 核心思想:在decoder的每一步,把encoder端所有的向量提供给decoder,这样decoder根据当前自身状态,来自动选择需要使用的向量和信息. 【注意力带来的可解释性】 decoder在每次生成时可以关注到encoder端所有位置的…

Kicad编译

Windows 1.安装visual studio Pro 2019 以上版本,建议2022,自行破解,安装时一定要勾选上cmake工具;安装Git bash 2.去Gitlab上fork kicad的master分支到自己的gitlab仓库上,在本地创建kicad-source路径,初…

B站 Java相关学习资源汇总

一、计算机网络 计算机网络微课堂 https://www.bilibili.com/video/BV1c4411d7jb?p1 讲师:湖科大教书匠 评价:通俗易懂,重点知识十分细致,配合实验,而且有考研408 的难题的讲解,也是非常适合考研党&#…

【线程池】ScheduledExecutorService接口和ScheduledThreadPoolExecutor定时任务线程池使用详解

目录 〇、简介 0.1 ScheduledExecutorService 和 Timer 的区别 一、什么是ScheduledExecutorService? 二、ScheduledThreadPoolExecutor中的方法 2.1 构造方法 2.2 schedule方法 2.3 scheduleAtFixedRate方法 2.4 scheduleWithFixedDelay方法 2.5 setConti…

【Java】直接return 会触发try-catch 里面的finally的方法么

🐱‍🚀/背景 try-catch 主要的作用是捕获异常,那么程序没有异常,finally里面代码能否执行? 特别是如果我们前面进行了加锁等操作,没有释放锁,那不是会造成业务逻辑问题, 先说结论:…

oracle只读打开数据库

客户经常有这样的需求,数据库已迁移,但还是希望原库可以打开,就只能只读模式打开了 方法一 SYSorcl> STARTUP OPEN READ ONLY; ORACLE instance started. Total System Global Area 4.0086E10 bytes Fixed Size 22549…

大体积mbtiles影像地图文件用什么软件浏览?

mbtiles格式简称mbt,是一种影像地图文件。PC端和手机端都有软件可以加载留着mbt格式的影像地图。 电脑桌面端 电脑端上的软件可以使用“图新地球”,直接把mbt文件拖到地图上即可,非常简便。 手机端 可以从华为应用商店下载“外业精灵”app…

【Linux】 -- TCP协议 (一)

TCP协议 Tcp协议可靠性冯诺依曼体系结构 TCP的协议格式序号与确认序号窗口大小六个标志位 确认应答机制 (ACK)超时重传机制连接管理机制 Tcp协议 TCP全称为 “传输控制协议”(Transmission Control Protocol) TCP协议被广泛应用…

基于深度学习的高精度动物园动物检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度动物园动物(水牛、斑马、大象、水豚、海龟、猫、奶牛、鹿、狗、火烈鸟、长颈鹿、捷豹、袋鼠、狮子、鹦鹉、企鹅、犀牛、羊、老虎)检测识别系统可用于日常生活中或野外来检测与定位动物园动物,利用深度学…

【需求实现】Tensorflow2的曲线拟合(三):Embedding层

文章目录 导读Embedding的维度问题Embedding的输入输出比较容易踩的坑input_shape与input_length的对应关系built属性 导读 这是填曲线拟合第一篇的坑,有关Embedding层的问题。 Embedding的维度问题 首先是上次我们提到的Embedding层,他确实能够做到将…

6.4.2 文件隐藏属性

chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效, 其他的文件系统可能就无法完整的支持这个指令了,例如 xfs 仅支持部份参数而已。 chattr (设置文件隐藏属性) 这个指令很重要,在系统的数据安全上面…

uniapp小程序订单页面UI

前言 之前用模板写了订单页面,由于需求改了导致这个页面做更新麻烦,弄了一下午,索性全部删除了自己写了,上面的tabs用的是b-ui框架写的,其他的都是原生写法。 🙏如果这篇文章对你有帮助还请收藏点赞关注&…