SpringBoot中使用MongoDB

目录

搭建实体类

基本的增删改查操作

分页查询

使用MongoTemplate实现复杂的功能


引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

在application.yml中写配资

spring:data:mongodb:# 主机地址host: 47.115.217.159# 端口port: 27017# 数据库名称database: test

启动项目,如果成功启动,说明基础配资没有问题

搭建实体类

MongoDB中的集合结构

字段名称字段含义字段类型备注
_idIDObjectId或StringMongo的主键字段,唯一标识每条评论记录
articleid文章IDString评论所属文章的唯一标识符
content评论内容String用户发表的评论内容
userid评论人IDString发表评论的用户的唯一标识符
nickname评论人昵称String发表评论的用户昵称
createdatetime评论的日期时间Date评论创建的时间戳
likenum点赞数Int32评论获得的点赞数量
replynum回复数Int32评论收到的回复数量
state状态String评论的状态,"0"表示不可见,"1"表示可见
parentid上级IDString如果为"0",表示这是文章的顶级评论;否则,表示这是对另一条评论的回复

实体类

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/*** 文章评论实体类*/
//把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
//@Document(collection="mongodb 对应 collection 名")
@Document(collection="comment")//可以省略,如果省略,则默认使用类名小写映射集合
//复合索引
// @CompoundIndex( def = "{'userid': 1, 'nickname': -1}")
@Data
@ToString
public class Comment implements Serializable {//主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写@Idprivate String id;//主键//该属性对应mongodb的字段的名字,如果一致,则无需该注解@Field("content")private String content;//吐槽内容private Date publishtime;//发布日期//添加了一个单字段的索引@Indexedprivate String userid;//发布人IDprivate String nickname;//昵称private LocalDateTime createdatetime;//评论的日期时间private Integer likenum;//点赞数private Integer replynum;//回复数private String state;//状态private String parentid;//上级IDprivate String articleid;
}

说明:

索引可以大大提升查询效率,一般在查询字段上添加索引,索引的添加可以通过Mongo的命令来添加,也可以在Java的实体类中通过注解添加。

1)单字段索引注解@Indexed

声明该字段需要索引,建索引可以大大的提高查询效率。

2)复合索引注解@CompoundIndex

复合索引的声明,建复合索引可以有效地提高多字段的查询效率。

基本的增删改查操作

(1)创建数据访问接口 

public interface CommentDao extends MongoRepository<Comment,String> {
}

MongoRepository这个类它封装了很多基本的MongoDB操作,类似于关系型数据库的mybatis-plus。

(2)创建业务逻辑类

@Service
public class CommentService {//注入dao@Autowiredprivate CommentDao commentDao;/*** 保存一个评论* @param comment*/public void saveComment(Comment comment){//如果需要自定义主键,可以在这里指定主键;如果不指定主键,MongoDB会自动生成主键//设置一些默认初始值。。。//调用daocommentDao.save(comment);}/*** 更新评论* @param comment*/public void updateComment(Comment comment){//调用daocommentDao.save(comment);}/*** 根据id删除评论* @param id*/public void deleteCommentById(String id){//调用daocommentDao.deleteById(id);}/*** 查询所有评论* @return*/public List<Comment> findCommentList(){//调用daoreturn commentDao.findAll();}/*** 根据id查询评论* @param id* @return*/public Comment findCommentById(String id){//调用daoreturn commentDao.findById(id).get();}}

(3)新建测试类,测试保存和查询所有:

@SpringBootTest
class ApplicationTests {//注入Service@Autowiredprivate CommentService commentService;/*** 保存一个评论*/@Testpublic void testSaveComment(){Comment comment=new Comment();comment.setArticleid("100000");comment.setContent("测试添加的数据");comment.setCreatedatetime(LocalDateTime.now());comment.setUserid("1003");comment.setNickname("凯撒大帝");comment.setState("1");comment.setLikenum(0);comment.setReplynum(0);commentService.saveComment(comment);}/*** 查询所有数据*/@Testpublic void testFindAll(){List<Comment> list = commentService.findCommentList();for (Comment comment : list) {System.out.println(comment);}}/*** 测试根据id查询*/@Testpublic void testFindCommentById(){Comment comment = commentService.findCommentById("1");System.out.println(comment);}}

保存评论测试结果:

查询所有评论测试结果

根据Id查询测试结果

分页查询

需求:查询UserId相同的全部数据,并且分页显示

实现:

(1)CommentDao新增方法定义

@Repository
public interface CommentDao extends MongoRepository<Comment,String> {Page<Comment> findAllByUserid(String userid, Pageable pageable);
}

这里面定义方法必须按照指定的格式来定义,比如想要查询方法,就需要以findBy开头,By后面的要与形参的第一个参数名称相同。

(2)CommentService新增方法

public Page<Comment> findCommentByUserId(String id,int page, int size){return commentDao.findAllByUserid(id,PageRequest.of(page-1, size));
}

(3)测试用例

    @Testpublic void testFindCommentListPageByParentid(){Page<Comment> pageResponse = commentService.findCommentByUserId( "1003",1, 2);System.out.println("----总记录数:"+pageResponse.getTotalElements());System.out.println("----当前页数据:");for (Comment comment : pageResponse.getContent()) {System.out.println(comment);}}

运行结果

使用MongoTemplate实现复杂的功能

前面MongoDB自动提供的那些功能都比较基础,功能都比较单一,如果要实现功能性复杂一点的语句,就需要借助MongoTemplate来实现。

需求:将指定id的likenum加1

根据上面的基本功能实现

/**
* 点赞-效率低
* @param id
*/
public void updateCommentThumbupToIncrementingOld(String id){
Comment comment = CommentRepository.findById(id).get();
comment.setLikenum(comment.getLikenum()+1);
CommentRepository.save(comment);
}

以上方法虽然实现起来比较简单,但是执行效率并不高,因为我只需要将点赞数加1就可以了,没必要查询出所有字段修改后再更新所有字段。

所以使用MongoTemplate实现

实现:

(1)修改CommentService

    @AutowiredMongoTemplate mongoTemplate;/*** 点赞数+1* @param id*/public void updateCommentLikenum(String id){//查询对象Query query= Query.query(Criteria.where("_id").is(id));//更新对象Update update=new Update();//局部更新,相当于$set:    update.set(key,value)//递增$inc:   update.inc("likenum",1);update.inc("likenum");//参数1:查询对象//参数2:更新对象//参数3:集合的名字或实体类的类型Comment.classmongoTemplate.updateFirst(query,update,"comment");}

(2)测试

    @Testpublic void testUpdateCommentLikenum(){//对3号文档的点赞数+1System.out.println("修改之前的数据:");System.out.println(commentService.findCommentById("3").getLikenum());commentService.updateCommentLikenum("3");System.out.println("修改之后的数据:");System.out.println(commentService.findCommentById("3").getLikenum());}

运行结果

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

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

相关文章

CentOS 8.5 安装配置 Tinyproxy 轻量代理服务器 Windows10 系统设置http代理 详细教程

1 下载 下载地址 2 上传服务器并解压 tar zxvf tinyproxy-1.11.2.tar.gz 3 安装配置 #安装依赖软件 yum install automake cd tinyproxy-1.11.2/ #生成configure ./autogen.sh # ./configure --prefix/usr/local/tinyproxy make make install 4 配置环境 vim /etc/prof…

【教程】最新MySQL8.3.0社区版安装指南(超详细)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 文章目录 一、下载安装包二、解压安装包三、设置配置文件四、配置系统环境五、初始化操作 此次安装的版本为MySQL社区版&…

【JVM】Class文件的格式

目录 概述 Class文件的格式 概述 Class文件是JVM的输入&#xff0c;Java虚拟机规范中定义了Class文件的结构。Class文件是JVM实现平台无关、技术无关的基础。 1:Class文件是一组以8字节为单位的字节流&#xff0c;各个数据项目按顺序紧凑排列 2:对于占用空间大于8字节的数据…

实验室信息管理系统主要解决哪些问题,能帮实验室从哪些方面提升效率?

实验室信息管理系统&#xff08;LIMS&#xff09;是一种全面精益化管理工具&#xff0c;它对实验室的人、机、料、法、环进行精确管理&#xff0c;使监测业务高效、准确、方便&#xff0c;确保实验室的运行效率和数据安全性得到极大的提升。通过LIMS&#xff0c;实验室能够实现…

Android Studio连接MySQL8.0

【序言】 移动平台这个课程要做一个app的课设&#xff0c;我打算后期增加功能改成毕设&#xff0c;就想要使用MySQL来作为数据库&#xff0c;相对于SQLlite来说&#xff0c;我更熟悉MySQL一点。 【遇到的问题】 一直无法连接上数据库&#xff0c;开始的时候查了很多资料&#…

qt for android 的架构原理

qt for android实现架构&#xff0c;分享这几幅很不错图。来自于 《Qt 林斌&#xff1a;整合Android IVI平台打造统一的Qt数字座舱体验》 1.实现架构图 2.qt for android能力 3.java 和 qt混合开发 4. AutoMotive

微信小程序按钮去除边框线

通常我们去掉按钮边框直接设置 border:0 但是在小程序中无效&#xff0c;设置outline:none也没用&#xff0c;当然可能你会说加权重&#xff1b;试过了无效 实际上该样式是在伪元素::after内&#xff0c;主要你检查css 还看不到有这个关系&#xff0c;鹅厂就是坑多 类样式::…

从loss角度理解LLM涌现能力

如今的很多研究都表明小模型也能出现涌现能力&#xff0c;本文的作者团队通过大量实验发现模型的涌现能力与模型大小、训练计算量无关&#xff0c;只与预训练loss相关。 作者团队惊奇地发现&#xff0c;不管任何下游任务&#xff0c;不管模型大小&#xff0c;模型出现涌现能力…

Axure RP移动端交互元件库/交互原型模板

作品类型&#xff1a;元件库/原型模板 更新日期&#xff1a;2023-12-04 当前版本&#xff1a;V1.3 适用范围&#xff1a;App应用/小程序 Axure版本&#xff1a;Axure 9.0均可打开 文件大小&#xff1a;36.7M 历时两个月制作并整理了手机移动端常用的75种组件、90个常用界面模板…

【算法】最短路问题 bfs 到 dijkstra

1976、到达目的地的方案数 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff0c;某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口&#xff0c;且任意两个路口之间最多有一条路。 给你一个整数 n 和二维整…

使用socat做端口转发

最近买的云上mongo数据库但是数据库不支持外网访问&#xff0c;准备做iptables转发但是一直不成功&#xff0c;腾讯云官方给予的解释是受服务器内启动的docker影响 做iptables转发会冲突&#xff0c;所以只能另想办法&#xff0c;我发现使用socat做转发也很好用&#xff0c;所以…

C语言基础——循环语句

&#x1f33a;​&#x1f64f;&#x1f64f;&#x1f64f;欢迎大家观看&#xff0c;写的好的话希望三连感谢&#x1f64f;&#x1f64f;&#x1f64f;&#x1f33a; 文章目录 一、循环语句的介绍 二、不同循环语句的使用 1.while循环 1.1 while循环的使用方式 1.2 while循环的执…

初识sql注入--手工注入

目录 可能使用的sql函数 入侵网站方式 1、文件上传漏洞 2、rce 3、sql注入 SQL注入 什么是sql注入 进行SQL注入 实验环境 开始实验&#xff08;使用information_shema数据库&#xff09; 1、进入靶场 2、报列数 下面来解释一下为什么要照上面SQL语句写 url编码 单…

六级翻译笔记

理解加表达 除了专有名词不能自己理解翻译&#xff0c;其它都可以 时态一般唯一 题目里出现有翻译为 客观存在&#xff1a; there be 单词结尾加er和ee的区别&#xff1a;er是主动&#xff0c;ee是被动 中文句子没有被动&#xff0c;也可以英文翻译为被动 中文的状语可以不是…

【Linux笔记】 基础指令(二)

风住尘香花已尽 日晚倦梳头 重命名、剪切指令 -- mv 简介&#xff1a; mv 命令是 move 的缩写&#xff0c;可以用来移动文件或者将文件改名&#xff0c;是 Linux 系统下常用的命令&#xff0c;经常用来备份文件或者目录 语法&#xff1a; mv [选项] 源文件或目录 目标文件或目录…

stm32——OLED篇

技术笔记&#xff01; 一、OLED显示屏介绍&#xff08;了解&#xff09; 1. OLED显示屏简介 二、OLED驱动原理&#xff08;熟悉&#xff09; 1. 驱动OLED驱动芯片的步骤 2. SSD1306工作时序 三、OLED驱动芯片简介&#xff08;掌握&#xff09; 1. 常用SSD1306指令 2. …

iOS 提交项目到github(本地没有该项目)

流程简介 申请github账号&#xff08;如果有请跳过&#xff09; add repository创建项目开心的提交就好 具体过程 1. 申请账号&#xff08;本部分不做介绍&#xff0c;请自行研究&#xff09; 2. 如果有账号&#xff0c;按照下面图片依次操作就好 点击该图中的New reposito…

AI语音模型PaddleSpeech踩坑(安装)指南

PaddleSpeech简介 PaddleSpeech 是基于飞桨 PaddlePaddle 的语音方向的开源模型库&#xff0c;用于语音和音频中的各种关键任务的开发&#xff0c;包含大量基于深度学习前沿和有影响力的模型。 PaddleSpeech安装步骤 提示&#xff1a;要找到一个合适的PaddleSpeech版本与pad…

sklearn之线性回归——以上证红利指数为例

文章目录 线性回归概念使用sklearn实现上证中立指数预测内置数据集的加载与处理 外部数据集的加载和处理数据内容数据加载和处理 开始预测分割数据集导入线性回归模型查看线性回归模型的系数绘制预测结果预测效果评估 最终代码 线性回归 线性回归&#xff08;Linear Regressio…

无管理员权限linux系统手动切换cuda版本

查看当前计算机cudatoolkit的版本 nvcc -V下载 如果想切换到指定版本&#xff0c;则去官网下载&#xff08;10.1版本为例&#xff09;&#xff1a; cuda下载 cudnn下载 将下载好的文件放到服务器的文件夹中 安装 安装cuda sh cuda_10.1.243_418.87.00_linux.run选择接受 …