springboot中使用mongodb完成评论功能

news2024/11/30 11:38:10

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{

    @Autowired
    private MongoTemplate mongoTemplate;

 
    /**
     * 条件查询分页
     * @date 2024/11/10 11:42
     * @param customerId 评论人id
     * @param isShow 审核状态
     * @param isFeature 是否是精选
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param pageable 分页
     * @return
     */
    @Override
    public 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
     */
    @Override
    public 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.coloradmin.cn/o/2250402.html

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

相关文章

TCGA 编码格式解读 | 怎么区分是不是肿瘤样品?

最权威参考资料 https://docs.gdc.cancer.gov/Encyclopedia/pages/TCGA_Barcode/ "-"分割符的第四位是Sample type&#xff1a; Tumor types range from 01 - 09,normal types from 10 - 19and control samples from 20 - 29. See Code Tables Report for a compl…

百度 文心一言 vs 阿里 通义千问 哪个好?

背景介绍&#xff1a; 在当前的人工智能领域&#xff0c;随着大模型技术的快速发展&#xff0c;市场上涌现出了众多的大规模语言模型。然而&#xff0c;由于缺乏统一且权威的评估标准&#xff0c;很多关于这些模型能力的文章往往基于主观测试或自行设定的排行榜来评价模型性能…

【linux学习指南】Linux进程信号产生(二)软件中断

文章目录 &#x1f4dd; 由软件条件产⽣信号&#x1f320; 基本alarm验证-体会IO效率问题&#x1f309;设置重复闹钟 &#x1f320;如何理解软件条件&#x1f309;如何简单快速理解系统闹钟 &#x1f6a9;总结 &#x1f4dd; 由软件条件产⽣信号 SIGPIPE 是⼀种由软件条件产⽣…

蓝桥杯每日真题 - 第24天

题目&#xff1a;&#xff08;货物摆放&#xff09; 题目描述&#xff08;12届 C&C B组D题&#xff09; 解题思路&#xff1a; 这道题的核心是求因数以及枚举验证。具体步骤如下&#xff1a; 因数分解&#xff1a; 通过逐一尝试小于等于的数&#xff0c;找到 n 的所有因数…

python学opencv|读取图像

【1】引言 前序学习了使用matplotlib模块进行画图&#xff0c;今天开始我们逐步尝试探索使用opencv来处理图片。 【2】学习资源 官网的学习链接如下&#xff1a; OpenCV: Getting Started with Images 不过读起来是英文版&#xff0c;可能略有难度&#xff0c;所以另推荐一…

ROS2教程 - 2 环境安装

更好的阅读体验&#xff1a;https://www.foooor.com 2 环境安装 下面以 ROS2 的 humble 版本为例&#xff0c;介绍 ROS2 的安装。 ROS1 只能在 ubuntu 系统上安装&#xff0c;ROS2全面支持三种平台&#xff1a;Ubuntu、MAC OS X、Windows10&#xff0c;下面在 Ubuntu22.04 …

神经网络入门实战:(六)PyTorch 中的实用工具 SummaryWriter 和 TensorBoard 的说明

(一) SummaryWriter 这里先讲解 SummaryWriter &#xff0c;TensorBoard 会在第二大点进行说明。 SummaryWriter 是 PyTorch 中的一个非常实用的工具&#xff0c;它主要用于将深度学习模型训练过程中的各种日志和统计数据记录下来&#xff0c;并可以与 TensorBoard 配合使用&am…

git的使用(简洁版)

什么是 Git&#xff1f; Git 是一个分布式版本控制系统 (DVCS)&#xff0c;用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建&#xff0c;最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具&#xff0c;使得开发者…

联想M7400Pro打印机报无法打印02 关闭电源,然后重新打开。故障检修分析

联想M7400Pro打印机无法打印02可能是由于硬件故障、软件问题、通信故障等引起的。 以下是故障的解决方法: 1、关闭打印机(可尝试多次重新启动打印机)。 2、重新放置碳粉盒组件。 3、检查打印机驱动程序是否已正确安装。 4、检查打印机的设置,确保已选择正确的打印模式…

排序(数据结构)

排序&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 常见排序法 . 常见排序算法的实现 插入排序 1.直接插入排序 2.希尔排序( 缩小增量排序&#xff09; 希尔排序的特性总结&#x…

【深度学习】铝箔表面缺陷检测【附链接】

一、铝箔表面缺陷种类 铝箔广泛应用于食品包装、药品包装和工业用途等领域&#xff0c;表面质量直接影响产品的性能和安全性。铝箔表面常见的缺陷主要包括&#xff1a; 划痕&#xff1a;铝箔在生产、加工或运输过程中可能会出现划痕&#xff0c;影响外观和功能。 气泡&#x…

OpenCV 图像轮廓查找与绘制全攻略:从函数使用到实战应用详解

摘要&#xff1a;本文详细介绍了 OpenCV 中用于查找图像轮廓的 cv2.findContours() 函数以及绘制轮廓的 cv2.drawContours() 函数的使用方法。涵盖 cv2.findContours() 各参数&#xff08;如 mode 不同取值对应不同轮廓检索模式&#xff09;及返回值的详细解析&#xff0c;搭配…

AI之Data之Label Tool:Label Studio(多类型数据标注工具)的简介、安装和使用方法、案例应用之详细攻略

AI之Data之Label Tool&#xff1a;Label Studio(多类型数据标注工具)的简介、安装和使用方法、案例应用之详细攻略 目录 Label Studio的简介 1、特点 Label Studio的安装和使用方法&#xff1a; 1、Label Studio 提供多种安装方式 T1、使用Docker安装 T2、使用pip安装&am…

【Linux相关】服务器无网情况配置conda

【Linux相关】 服务器无网情况配置conda 文章目录 环境配置1. 本地下载miniconda&#xff0c;传到服务器2. 确认安装包是否传送成功3. 确保有安装权限4. 安装5. 写路径6. 看一下是否成功 环境配置 ssh的话&#xff0c;服务器连不上网&#xff0c;无法在线下载&#xff0c;需要本…

Redis使用场景-缓存-缓存穿透

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题&#xff0c;其中缓存穿透、击穿、雪崩在面试中问的最频繁&#xff0c;本文加了图解&#xff0c;希望帮助你更直观的了解缓存穿透&#x1f600; &#xff08;放出之前写的针对实习面试的关于Redis生产问题的博…

Docker desktop 改变存储位置

项目场景&#xff1a; 在windows下&#xff0c;使用docker desktop是使用docker最简单直接的方式。但是&#xff0c;这毕竟是一个可视化的界面&#xff0c;使用起来还是和linux环境下的版本有很大的区别。 例如&#xff0c;使用docker desktop&#xff0c;会默认将镜像以及容…

[CA] 尝试深入理解core.cpp -1

#我给你代码&#xff0c;你给我在源代码上额外加上中文注释&#xff01;&#xff0c;如果是函数告诉我它读取了什么结构&#xff0c;传递了什么值&#xff0c;可能或者已经知道它将在哪些函数利用&#xff0c;是体现了pipeline 的哪一步# #include "core.h" #includ…

宠物空气净化器推荐2024超详细测评 希喂VS霍尼韦尔谁能胜出

最近有粉丝一直在评论区和后台探讨宠物空气净化器是不是智商税的问题&#xff0c;有人认为宠物空气净化器肯定不是智商税&#xff0c;有些人认为将其购回家就是个没用的东西&#xff0c;还占地方&#xff0c;双方各有自己的观点。 其实宠物空气净化器和普通的空气净化器是有很大…

NeuIPS 2024 | YOCO的高效解码器-解码器架构

该研究提出了一种新的大模型架构&#xff0c;名为YOCO&#xff08;You Only Cache Once&#xff09;&#xff0c;其目的是解决长序列语言模型推理中的内存瓶颈。YOCO通过解码器-解码器结构的创新设计&#xff0c;显著减少推理时的显存占用并提升了长序列的处理效率。 现有大模…

《数据挖掘:概念、模型、方法与算法(第三版)》

嘿&#xff0c;数据挖掘的小伙伴们&#xff01;今天我要给你们介绍一本超级实用的书——《数据挖掘&#xff1a;概念、模型、方法与算法》第三版。这本书是数据挖掘领域的经典之作&#xff0c;由该领域的知名专家编写&#xff0c;系统性地介绍了在高维数据空间中分析和提取大量…