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 后,不能开机自启。 在服务中,手动启动服务后,可正常使用,一点异常都没有。 或者…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...