springboot中使用mongodb完成评论功能
pom文件中引入
<!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
yml中配置连接
data:mongodb:uri: mongodb://admin:123456@127.0.0.1:27017/test?authSource=admin&authMechanism=SCRAM-SHA-1
评论表字段如下(根据自己的需求设计)
public class Comment {@Id@ApiModelProperty(value = "评论id***********数据类型:string")private String id;/*** 父级评论id*/@ApiModelProperty(value = "父级评论id***********数据类型:int")private String pid;/*** 用户id*/@ApiModelProperty(value = "用户id***********数据类型:int")private Integer customerId;/*** 用户姓名*/@ApiModelProperty(value = "用户姓名***********数据类型:string")private String customerName;/*** 用户头像*/@ApiModelProperty(value = "用户头像***********数据类型:string")private String customerAvatar;/*** 是否是会员:1:是;2:否*/@ApiModelProperty(value = "是否是会员:1:是;2:否***********数据类型:int")private Integer customerIsVip;/*** 评论内容*/@ApiModelProperty(value = "评论内容***********数据类型:string")private String content;/*** 评论图片*/@ApiModelProperty(value = "评论图片***********数据类型:string")private String image;/*** 业务类型 */@ApiModelProperty(value = "业务类型***********数据类型:int")private Integer busType;/*** 业务id*/@ApiModelProperty(value = "业务id***********数据类型:long")private Long busId;/*** 审核状态 1:待审核;2:审核通过;3:审核失败*/@ApiModelProperty(value = "审核状态 1:待审核;2:审核通过;3:审核失败***********数据类型:int")private Integer isShow;/*** 是否置顶 1:是;2:否*/@ApiModelProperty(value = "是否置顶 1:是;2:否***********数据类型:int")private Integer isTop;/*** 是否是作者 1:是;2:否*/@ApiModelProperty(value = "是否是作者 1:是;2:否***********数据类型:int")private Integer isAuthor;/*** 是否为精选评论 1:是;2:否*/@ApiModelProperty(value = "是否为精选评论 1:是;2:否***********数据类型:int")private Integer isFeatured;/*** 是否为首评 1:是;2:否*/@ApiModelProperty(value = "是否为首评 1:是;2:否***********数据类型:int")private Integer isFirst;/*** 被回复评论id*/@ApiModelProperty(value = "被回复评论id***********数据类型:int")private String replyId;/*** 被回复用户id*/@ApiModelProperty(value = "被回复用户id***********数据类型:int")private Integer replyCustomerId;/*** 是否是会员:1:是;2:否*/@ApiModelProperty(value = "是否是会员:1:是;2:否***********数据类型:int")private Integer replyCustomerIsVip;/*** 被回复用户姓名*/@ApiModelProperty(value = "被回复用户姓名***********数据类型:string")private String replyCustomerName;/*** 被回复用户头像*/@ApiModelProperty(value = "被回复用户头像***********数据类型:string")private String replyCustomerAvatar;/*** 点赞数量*/@ApiModelProperty(value = "点赞数量***********数据类型:int")private Integer likeCount;/*** 点赞状态 1:已赞;2:未赞*/@ApiModelProperty(value = "点赞状态 1:已赞;2:未赞***********数据类型:int")private Integer thumbUpStatus;/*** 是否是朋友 0:是;1:否*/@ApiModelProperty(value = "点赞状态 1:已赞;2:未赞***********数据类型:int")private Integer isFriend;/*** 发表时间*/@ApiModelProperty(value = "发表时间***********数据类型:date")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;/*** 是否是首评 1:是;2:否*/@ApiModelProperty(value = "是否是首评 1:是;2:否***********数据类型:int")public Integer getIsFirst() {return isFirst;}/*** 是否是回复1级 1:是;2否*/@ApiModelProperty(value = "是否是回复1级 1:是;2否***********数据类型:int")public Integer isReplyOne;/*** 修改时间*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date updateTime;/*** 子评论*/@ApiModelProperty(value = "子评论***********数据类型:obj")private Page<AiComment> childrens;
创建CommentRespository并且继MongoRepository<Comment,String>
package com.mongo.respository;import com.mongo.domain.Comment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.repository.MongoRepository;import java.util.List;public interface CommentRespository extends MongoRepository<Comment,String> {/*** 通过条件查询分页* @date 2024/10/12 18:05* @param busType 业务类型* @param busId 业务id* @param isShow 是否显示* @param pid 父id* @param pageable 分页* @return */Page<Comment> findByBusTypeAndBusIdAndIsShowAndPid(Integer busType, Long busId, Integer isShow, String pid, Pageable pageable);/*** 通过评论id查询* @date 2024/11/27 11:35* @param id 评论id* @param list 是否显示* @param pageable 分页* @return */Page<Comment> findByIdAndIsShowIn(String id, List<Integer> list, Pageable pageable);/*** 通过业务类型和业务id查询是否存在评论* @date 2024/11/18 10:44* @param busType 业务类型 * @param busId 业务id * @return*/List<Comment> findAiCommentByBusTypeAndAndBusId(Integer busType,Long busId);/*** 通过条件查询分页(如果有敏感的词自己可以查看)* @date 2024/11/21 18:23* @param busType 业务类型* @param busId 业务id* @param isShow 是否显示* @param pid 父id* @param busType2 业务类型* @param busId2 业务id* @param pid2 父id* @param customerId 用户id* @param list 审核状态* @param pageable 分页* @return*/Page<Comment> findByBusTypeAndBusIdAndIsShowAndPidOrBusTypeAndBusIdAndPidAndCustomerIdAndIsShowIn(Integer busType,Long busId,Integer isShow,String pid,Integer busType2,Long busId2,String pid2,Integer customerId,List<Integer> list,Pageable pageable);
}
此MongoRepository的好处是对于一些比较简单的查询可以直接按字段组装来查询
比如findByIdAndIsShowIn 就是通过业务id和展示的状态来查询 直接见明识意
还有一种查询方式针对比较麻烦的sql语句
在respository中定义
package com.mongo.respository;import com.mongo.domain.AiComment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;import java.util.Date;
import java.util.List;public interface CommentRespository extends MongoRepository<Comment,String> {/*** 条件查询分页* @date 2024/11/10 11:42* @param customerId 评论人id* @param isShow 审核状态* @param isFeature 是否是精选* @param startDate 开始日期* @param endDate 结束日期* @param pageable 分页* @return*/List<Comment> findByParams(Integer customerId, Integer isShow, Integer isFeature, Date startDate, Date endDate, Pageable pageable);/*** 条件查询总数* @date 2024/11/10 11:42* @param customerId 评论人id* @param isShow 审核状态* @param isFeature 是否是精选* @param startDate 开始日期* @param endDate 结束日期* @return java.lang.Long*/Long countParams(Integer customerId, Integer isShow, Integer isFeature, Date startDate, Date endDate);
}
实现类继承此类
package com.mongo.respository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import com.mongo.domain.Comment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.repository.query.FluentQuery;
import org.springframework.stereotype.Repository;import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;@Repository
public class CommentRespositoryImpl implements CommentRespository{@Autowiredprivate MongoTemplate mongoTemplate;/*** 条件查询分页* @date 2024/11/10 11:42* @param customerId 评论人id* @param isShow 审核状态* @param isFeature 是否是精选* @param startDate 开始日期* @param endDate 结束日期* @param pageable 分页* @return*/@Overridepublic List<Comment> findByParams(Integer customerId, Integer isShow, Integer isFeature, Date startDate, Date endDate, Pageable pageable) {Criteria criteria = new Criteria();Query query = new Query();if (null != customerId) {criteria.and("customerId").is(customerId);}if (null != isShow) {criteria.and("isShow").is(isShow);}if (null != isFeature) {criteria.and("isFeatured").is(isFeature);}if (null != startDate && null != endDate) {criteria.and("createTime").gte(startDate).lte(endDate);} else if (startDate!= null) {criteria.and("createTime").gte(startDate);} else if (endDate!= null) {criteria.and("createTime").lte(endDate);}query.addCriteria(criteria);return mongoTemplate.find(query.with(pageable), Comment.class);}/*** 条件查询总数* @date 2024/11/10 11:42* @param customerId 评论人id* @param isShow 审核状态* @param isFeature 是否是精选* @param startDate 开始日期* @param endDate 结束日期* @return java.lang.Long*/@Overridepublic Long countParams(Integer customerId, Integer isShow, Integer isFeature, Date startDate, Date endDate) {List<Criteria> criteriaList = new ArrayList<>();if (null != customerId) {criteriaList.add(Criteria.where("customerId").is(customerId));}if (null != isShow) {criteriaList.add(Criteria.where("isShow").is(isShow));}if (null != isFeature) {criteriaList.add(Criteria.where("isFeatured").is(isFeature));}if (null != startDate && null != endDate) {criteriaList.add(Criteria.where("createTime").gte(startDate).lte(endDate));} else if (startDate!= null) {criteriaList.add(Criteria.where("createTime").gte(startDate));} else if (endDate!= null) {criteriaList.add(Criteria.where("createTime").lte(endDate));}if (criteriaList.isEmpty()) {List<Comment> comments = mongoTemplate.findAll(Comment.class);if (comments.isEmpty()) {return 0L;} else {return (long) comments.size();}} else {Query query = Query.query(Criteria.where("").andOperator(criteriaList.toArray(new Criteria[0])));List<AiComment> posts = mongoTemplate.find(query, Comment.class);if (posts.isEmpty()) {return 0L;} else {return (long) posts.size();}}}}
通过Criteria和Query结合来查询
最后评论效果
评论字段说明
isReplyOne 如果是1的情况下回复一级就不显示谁回复谁
如果是一级以下的子评论isReplyOne是2就显示 张三回复李四
查询sql说明
PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize, Sort.by(Sort.Order.asc("isTop"), Sort.Order.desc("createTime"))); Page<Comment> page; if (0 == customerId) {page = aiCommentRespository.findByBusTypeAndBusIdAndIsShowAndPid(busType, busId, IsShowEnum.YES.getKey(), "0", pageRequest); } else {page = aiCommentRespository.findByBusTypeAndBusIdAndIsShowAndPidOrBusTypeAndBusIdAndPidAndCustomerIdAndIsShowIn(busType, busId, IsShowEnum.CHECK_SUCCESS.getKey(), "0", busType, busId, "0", customerId, Arrays.asList(0, 1), pageRequest); }
这里判断customerId为0是用户登陆与不登陆的情况下的操作
Arrays.asList(0, 1) 解释:因为评论可能涉及敏感信息,当用户自己评论了带有敏感的系统自动检测为敏感状态变为0(待审核状态),自己可以看到而别的用户不可以看到,所以isShow的查询条件为0,1。1为审核通过状态
findByBusTypeAndBusIdAndIsShowAndPidOrBusTypeAndBusIdAndPidAndCustomerIdAndIsShowIn
这条sql的解释:这是一条or语句
BusTypeAndBusIdAndIsShowAndPid 这是为了查询审核通过的评论
而or后面的语句是为了当本人评论了敏感的信息后可以让本人看到自己的评论而别人不可以看到
BusTypeAndBusIdAndPidAndCustomerIdAndIsShowIn
查询子评论 只需要要循环上面的评论 把pid换成主评论id即可
相关文章:

springboot中使用mongodb完成评论功能
pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…...
Dubbo的RPC泛化调用
目录 一、RPC泛化调用的应用场景 二、Dubbo RPC泛化调用的实现原理 三、Dubbo RPC泛化调用的实现步骤 四、示例代码 五、泛化调用怎么发现提供该接口的服务及服务的IP和端口? Dubbo的RPC泛化调用是一种在调用方没有服务方提供的API的情况下,对服务方…...
【k8s深入理解之 Scheme】全面理解 Scheme 的注册机制、内外部版本、自动转换函数、默认填充函数、Options等机制
参考 【k8s基础篇】k8s scheme3 之序列化_基于schema进行序列化-CSDN博客【k8s基础篇】k8s scheme4 之资源数据结构与资源注册_kubernetes 的scheam-CSDN博客常见问题答疑 【k8s深入理解之 Scheme 补充-1】理解 Scheme 中资源的注册以及 GVK 和 go 结构体的映射-CSDN博客【k8s深…...

接口性能优化宝典:解决性能瓶颈的策略与实践
目录 一、直面索引 (一)索引优化的常见场景 (二)如何检查索引的使用情况 (三)如何避免索引失效 (四)强制选择索引 二、提升 SQL 执行效率 (一)避免不必…...

雨晨 Windows Server 2025 数据中心 极简 26311.5000
文件: 雨晨 Windows Server 2025 数据中心 极简 26311.5000 install.esd 大小: 1740910278 字节 修改时间: 2024年11月29日, 星期五, 19:00:20 MD5: 5B946B9DED569E04917E804B25A0F736 SHA1: E78BB430B3E0397F6ACFEB821CF85EA7CFB5A00F CRC32: B3F76BD7 常规制作旨在测试YCDIS…...

关于IDE的相关知识之三【插件安装、配置及推荐的意义】
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于ide插件安装、配置及推荐意义的相关内容…...
JSP+Servlet实现列表分页功能
分享一种最简单的JSPServlet实现分页的方式! 旧:无分页功能的查询列表功能,仅供参考! Servlet try {Connection conn null;PreparedStatement ps null;ResultSet rs null;List<Dept> arrayList null;conn DBUtil.get…...
操作系统存储器相关习题
1 为什么要配置层次式存储器? 设置多个存储器可以使存储器两端的硬件能并行工作; 采用多级存储系统特别是Cache技术,是减轻存储器带宽对系统性能影响的最佳结构方案; 在微处理机内部设置各种缓冲存储器,减轻对存储器存取的压力。…...

QUICK 调试camera-xml解析
本文主要介绍如何在QUICK QCS6490使能相机模组。QCS6490的相机基于CameraX的框架,只需通过配置XML文件,设置相机模组的相关参数,就可以点亮相机。本文主要介绍Camera Sensor Module XML和Camera Sensor XML配置的解析,这中间需要c…...
【linux】shell脚本编写基础
shell 脚本关键字: 1、变量定义:前后不能空格 输入: zhao"Joe" echo ${zhao} echo "I am ${zhao}" 输出: yuxin I am Joe2、echo 输出 输入: echo "123" 输出: 1233、readonly 定义变…...
STM32 外设简介
STM32 外设简介 STM32 是由意法半导体 (STMicroelectronics) 开发的一系列基于 ARM Cortex 内核的微控制器,广泛应用于嵌入式系统中。STM32 系列的一个重要特点是其丰富而强大的外设模块,支持多种接口和功能,能满足工业控制、物联网、消费电…...
Django-Vue3-Admin - 现代化的前后端分离权限管理系统
项目介绍 Django-Vue3-Admin是一个基于RBAC(Role-Based Access Control)模型的综合性基础开发平台,专注于权限控制,支持列级别的细粒度权限管理。该项目采用前后端分离架构,技术栈包括: 后端: Django Django REST …...

Cesium K-means自动聚合点的原理
Cesium K-means自动聚合点的原理 Cesium 是一个开源的 JavaScript 库,用于在 Web 环境中创建 3D 地球和地图应用。它能够处理地理空间数据,并允许开发者对大规模的地理数据进行可视化展示。在一些应用中,尤其是当处理大量地理坐标点时&#…...
Vue 项目中如何解决组件之间的循环依赖
前言 在大型 Vue 项目中,组件之间的关系可能会变得非常复杂,甚至会出现循环依赖的问题。循环依赖是指两个或多个模块互相依赖,形成一个闭环。这类问题会导致项目无法正常编译或运行,甚至可能引发意想不到的错误。本文将通过通俗易…...

交通流量预测:基于交通流量数据建立模型
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

Hot100 - 搜索二维矩阵II
Hot100 - 搜索二维矩阵II 最佳思路: 利用矩阵的特性,针对搜索操作可以从右上角或者左下角开始。通过判断当前位置的元素与目标值的关系,逐步缩小搜索范围,从而达到较高的效率。 从右上角开始:假设矩阵是升序排列的&a…...
uart_pl011.c驱动API的zephyr测试
API概述 本次测试针对uart的uart_poll_in和uart_poll_outAPI进行测试, uart_poll_in static int pl011_poll_in(const struct device *dev, unsigned char *c)这是一个轮询方式的接收函数: 功能:检查 UART 是否有新数据到达,如…...

RPA:电商订单处理自动化
哈喽,大家好,我是若木,最近闲暇时间较多,于是便跟着教程做了一个及RPA,谈到这个,可能很多人并不是很了解,但是实际上,这玩意却遍布文末生活的边边角角。话不多说,我直接上…...

小程序 - 个人简历
为了让招聘人员快速地认识自己,可以做一个“个人简历”微信小程序, 展示自己的个人信息。 下面将对“个人简历”微信小程序进行详细讲解。 目录 个人简历 创建图片目录 页面开发 index.wxml index.wxss 功能实现截图 总结 个人简历 创建图片目录…...

MySQL自启动失败(MySQL不能开机自启)解决方案_MySQL开机自启疑难杂症解决,适用Win11/Win10
问题描述(MySQL 开机自启失败) 本文解决方法,在 windows10 、 windows11 系统中均可使用。 win11 安装 MySQL 后,不能开机自启。 在服务中,手动启动服务后,可正常使用,一点异常都没有。 或者…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...