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即可

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

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

相关文章

layui-vue第三方库表格列事件怎么写

插槽写入列点击事件 <div class"le-table-box" ref"TableBoxRef" :style"{ height: ShowPage ? calc(100% - 60px) : 100% }"><lay-table row-double"dbRowClick" :columns"TableColumn" :data-source"Table…

[在线实验]-Redis Docker镜像的下载与部署

镜像下载 dockerredis镜像资源-CSDN文库 加载镜像 使用以下命令从redis.tar文件中加载Docker镜像 docker load --input redis.tar 创建映射目录 为了确保Redis的数据能够持久化&#xff0c;我们需要创建一个本地目录来存储这些数据 mkdir -p datasource/docker/redis 运…

Flink CDC 使用实践以及遇到的问题

背景 最近公司在做一些业务上的架构调整&#xff0c;有一部分是数据从mysql采集到Starrocks&#xff0c;之前的一套方法是走 debezium 到 puslar 到 starrocks,这一套下来比较需要配置很多东西&#xff0c;而且出现问题以后&#xff0c;需要修改很多配置&#xff0c;而且现阶段…

配置idea环境进行scala编程

这里用的jdk是jdk-8u161,scala版本是2.12.0 在d盘新建一个本地仓库用来存放下载的maven包&#xff0c;在里面创建如下两个文件 更改settings文件为下面的样子 点击左下角的设置&#xff0c;更改maven本地仓库的位置&#xff08;默认在c盘用户目录下的.m2文件中&#xff0c;更改…

0017. shell命令--tac

目录 17. shell命令--tac 功能说明 语法格式 选项说明 实践操作 注意事项 17. shell命令--tac 功能说明 Linux 的 tac 命令用于按行反向输出文件内容&#xff0c;与 cat 命令的输出顺序相反。非常有趣&#xff0c;好记。也就是说&#xff0c;当我们使用tac命令查看文件内…

mimic插件使用

最近搞机械臂的末端夹具&#xff0c;本来想用吸盘的插件的&#xff0c;不知道为什么吸盘吸不起来可乐瓶&#xff0c;后面就换成夹爪了。 因为原厂的urdf文件中提供夹爪是用mimic标签控制剩下的5个joint关节的&#xff0c;网上参考的资料太少了&#xff0c;也是废了好多力 气&am…

Spring boot之BeanDefinition介绍

在spring框架中IOC容器进行bean的创建和管理。Bean的创建是一个比较复杂的过程&#xff0c;它并不像我们创建对象一样只是直接new一下就行&#xff0c;虽然有些bean确实就是New一下。但在Spring中可以通过一些途径对bean进行增强扩展。在这个过程中&#xff0c;BeanDefinition作…

redis基础spark操作redis

Redis内存淘汰策略 将Redis用作缓存时&#xff0c;如果内存空间用满&#xff0c;就会自动驱逐老的数据。 为什么要使用内存淘汰策略呢&#xff1f; 当海量数据涌入redis&#xff0c;导致redis装不下了咋办&#xff0c;我们需要根据redis的内存淘汰策略&#xff0c;淘汰一些不那…

【MyBatis】验证多级缓存及 Cache Aside 模式的应用

文章目录 前言1. 多级缓存的概念1.1 CPU 多级缓存1.2 MyBatis 多级缓存 2. MyBatis 本地缓存3. MyBatis 全局缓存3.1 MyBatis 全局缓存过期算法3.2 CacheAside 模式 后记MyBatis 提供了缓存切口&#xff0c; 采用 Redis 会引入什么问题&#xff1f;万一遇到需强一致场景&#x…

力扣--LCR 150.彩灯装饰记录II

题目 代码 if(root null){ return new ArrayList<>(); } Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();queue.add(root);while(!queue.isEmpty()){int k queue.size();List<Integer> …

RFdiffusion Potential类解读

1. Potential 类 功能 Potential 是一个接口类(抽象类),用于定义潜在函数的接口,要求继承它的类必须实现 compute 方法。它的设计遵循 面向对象编程的多态性原则,通过抽象接口确保子类实现特定功能,同时定义了一个通用的 API(即 compute 方法)。源代码: class Poten…

一款.NET开源的Windows资源管理器标签页工具

前言 今天大姚给大家分享一款基于.NET开发的可以让你在Windows资源管理器中使用Tab多标签功能的小工具&#xff1a;QTTabBar。 工具介绍 QTTabBar是一款基于.NET开发的可以让你在Windows资源管理器中使用Tab多标签功能的小工具。从此以后工作时不再遍布文件夹窗口&#xff0c…

PVE中VLAN的设置要点

使用这个拓扑进行连接无法直接访问PVE PVE 是这样设置如下&#xff1a; 核心重点&#xff1a;PVE 的 vmbr0 接口直接绑定了 enp2s0&#xff0c;这会导致 VLAN 流量无法正确处理&#xff0c;因为 PVE 没有专门为 VLAN 3 配置接口。 1.vmbr0 和 vmbr0.3 都是绑定在物理接口 enp2…

长城上,低空下,北京联通点亮5G-A的时代星光

2024年&#xff0c;被认为是5G-A的商用元年。在这个关键节点&#xff0c;大部分普通人最关心的问题可能是5G-A的引入、网络能力的提升&#xff0c;究竟能给我们带来哪些实用价值&#xff1f;在城市中到底有什么应用场景&#xff1f; 面对上述大众关切的问题&#xff0c;首善之都…

Vue使用Mockjs插件实现模拟数据

官方文档&#xff1a;Mock.js 一.引言 在前端开发过程中&#xff0c;我们经常会遇到后端接口尚未完成&#xff0c;但前端需要进行页面构建和功能测试的情况。这时候&#xff0c;Mockjs就如同救星一般出现了。Mockjs 是一款能够模拟生成随机数据&#xff0c;拦截 Ajax 请求并返…

阅读方法论

选择固有缺陷,选项是对比出来的

芯片测试-smith圆图

smith圆图 &#x1f4a2;smith圆图的故事&#x1f4a2;&#x1f4a2;smith圆图中的各部分来历&#x1f4a2;&#x1f4a2;公式推导&#x1f4a2;&#x1f4a2;等电阻圆特点&#x1f4a2;&#x1f4a2;等电抗圆&#x1f4a2;&#x1f4a2;等电抗圆特点&#x1f4a2; &#x1f4a…

聚云科技×亚马逊云科技:打通生成式AI落地最后一公里

云计算时代&#xff0c;MSP&#xff08;云管理服务提供商&#xff09;犹如一个帮助企业上云、用云、管理云的专业管家&#xff0c;在云计算厂商与企业之间扮演桥梁的作用。生成式AI浪潮的到来&#xff0c;也为MSP带来全新的生态价值和发展空间。 作为国内领先的云管理服务提供…

树莓派/Jetson Nano/...aarch64:安装Miniforge 或 Mambaforge

目录 一、下载链接&#xff08;我以miniforge为例&#xff09;二、赋予脚本可执行权限三、运行安装脚本四、添加环境变量 Miniforge 或 Mambaforge是Miniforge 项目提供了针对多种架构&#xff08;包括 aarch64&#xff09;的轻量级 Conda 发行版&#xff0c;它们是 Miniconda …

白嫖域名,无套路,无需手机注册,支持A解析,TXT解析

注册简单&#xff0c;连邮箱都不需要&#xff0c;不用填写任何资料。 支持A、redirectURL、AAAA、TXT等类型的记录&#xff0c;可以创建子域名 注册地址&#xff1a;Free DDNS 打开首页&#xff0c;输入想要的域名&#xff0c;点查询按钮。如果可用&#xff0c;再点击提交按钮…