【Mongodb-02】springboot整合mongodb(详解)

springBoot整和mongodb

    • 一,springboot整合mongodb
      • 1,依赖加入
      • 2,yml文件配置
      • 3,_class 字段过滤(可选)
      • 4,实体类定义
      • 5,索引创建
      • 6,数据插入
        • 6.1,insert方式
        • 6.2,使用save的方式实现
      • 7,数据更新
        • 7.1,update普通方式更新
        • 7.2,BulkOperations 方式更新
      • 8,数据查询
      • 9,数据删除

一,springboot整合mongodb

如需转载,请标明出处:https://zhenghuisheng.blog.csdn.net/article/details/139704356

此篇主要讲解在java中,如何通过springboot项目去操作mongodb,如何创建springboot项目此处省略

1,依赖加入

在pom文件中,加入对应的依赖,版本需要于springboot的版本对应

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

2,yml文件配置

首先进入配置阶段,在yml配置文件中加入以下配置,如果在安装之后的auth设置为false,那么不需要账号密码也能直接访问

spring:  
  data:
    mongodb:
      host: xxx.xxx.xxx.xxx
      port: 27017
      username: zhs
      password: 'zhs123456'
      database: archive
      authentication-database: admin

也可以用下面这种方式,uri方式和上面的参数不要重复,只能只使用一种,推荐使用上面这种,可读性强

spring:
  data:
    mongodb:
      uri: "mongodb://zhs:zhs123456@xxx.xxx.xxx.xxx:27017/archive"

3,_class 字段过滤(可选)

在实体类数据存入到mongodb时,会将这个 _class 实体类对应的类全路径也存到mongodb中,我这边不需要这个数据,几亿条数据都加一个这个实体类对象,除了占磁盘之外毫无意义,因此我这边选择将这个字段去掉,定义一个MongoConfig实体类,再注入到容器中即可

@Configuration
public class MongoConfig implements ApplicationListener<ContextRefreshedEvent> {
    @Resource
    MongoTemplate oneMongoTemplate;

    private static final String TYPEKEY = "_class";

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        MongoConverter converter = oneMongoTemplate.getConverter();
        if (converter.getTypeMapper().isTypeKey(TYPEKEY)) {
            ((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));
        }
    }
}

4,实体类定义

接下来定义一个User实体类作为测试用,通过这个Field注解实现实体类字段和mongodb的字段相关联,mongodb不需要像mysql一样需要提前建表,建好实体类就可以对mongodb中的集合进行操作了,User实体类就会对应Mongodb中的一个集合,相当于mysql的一张表,每条数据就是一个文档,每个文档大小限制16m

@Data
public class User {
    @Field("_id")
    private String id;
    
    @Field("username")
    private String username;

    @Field("password")
    private String password;
    
    //更新时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Field("updatedTime")
    private Date updatedTime;

    //创建时间
    @Field("createdTime")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createdTime;
}

5,索引创建

都使用mongodb了,后期数据量肯定是非常大的,不然也不可能考虑使用这个玩意儿。因此在文档建好之后,最好提前把索引建上。这里直接选择使用username 和 password作为唯一的联合索引。索引的建立根据实际业务考虑,不能确定是唯一就建普通索引

//user表示哪个集合
db.user.createIndex({username: 1,password:1}, {unique: true})

6,数据插入

mongodb有两种方法实现数据插入,一种是直接使用insert或者insertAll的方式插入,另一种是通过save的方式插入数据

6.1,insert方式

如果直接选择insert的方式插入数据,那么他会判断数据库中是否有这条数据,如通过id判断,如果已经有id为1的用户,再次插入id为1的用户数据时,那么就会直接抛一个异常出来,并且会让整个操作失败。代码如下,如果没有设置id,那么mongodb会自动设置一个唯一的uuid作为id,我这边直接使用一个雪花算法生成的id

User user = new User();
user.setId(SnowflakeUtils.nextId());  //该工具类需要自行生成,可百度
user.setUsername("zhs");
user.setPassword("123456");
user.setCreatedTime(new Date());
user.setUpdatedTime(new Date());
mongoTemplate.insert(user);

也可以直接使用一个批量插入的方式将数据插入,这样将多次io直接转换成1次io,效率更高

List<User> list = new ArrayList<>();
User user = new User();
...
list.add(user);
mongoTemplate.insertAll(list);
6.2,使用save的方式实现

整体操作和insert的一样,在数据插入时使用save方法。使用save方法可以让整体变得更加灵活,insert在集合中已经存在的文档id再插入时会直接抛出异常,但是save不会,会直接进行更新的操作,如果数据不存在则会插入操作。但是在此期间,每次save时需要遍历全部数据,判断数据是否存在,在效率上是远远不及这个insert的

User user = new User();
user.setId(SnowflakeUtils.nextId());  //该工具类需要自行生成,可百度
user.setUsername("zhs");
user.setPassword("123456");
user.setCreatedTime(new Date());
user.setUpdatedTime(new Date());
mongoTemplate.save(user);

综上所述,最好就是每次自定义的生成一个唯一id,然后使用insert去操作数据

7,数据更新

7.1,update普通方式更新

数据更新的方式如下,如果只需要更新一条数据,如下面代码。上面我根据username和password建立了唯一索引,因此只需要updateFirst更新一条数据即可

Query query = new Query();
query.addCriteria(Criteria.where("username").is("zhs"));
query.addCriteria(Criteria.where("password").is("zhs123456"));
Update update = new Update().set("password","zhs12345678");
mongoTemplate.updateFirst(query,update, User.class);

也可以通过这个updateMulti实现多条数据的更新,如下面将所有用户名为zhs的更新时间修改

Query query = new Query();
query.addCriteria(Criteria.where("username").is("zhs"));
Update update = new Update().set("updatedTime",new Date());
mongoTemplate.updateMulti(query,update,User.class);
7.2,BulkOperations 方式更新

上面这些事针对同一个where条件的,也可以针对不同更新文档实现批量更新,这里可以使用 BulkOperations 操作。如更新名为 zhs的密码为 zhs12345678,更新名为 zhsqaq 的密码为 zhsqaq12345678 ,总而言之就是将多条毫无关联的的更新语句一次更新完成

//创建一个BulkOperations实例
BulkOperations updateBulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "User");

创建完这个 BulkOperations 实例之后,接下来就是可以去创建多条更新语句,随后在构建完的查询与句话中,调用这个updateBulkOps.updateOne方法,再最后调用这个excute方法,将这些全部聚合的更新操作全部执行

//构建查询条件1
Query query1 = new Query();
query1.addCriteria(Criteria.where("username").is("zhs"));
query1.addCriteria(Criteria.where("password").is("zhs123456"));
Update update1 = new Update().set("password","zhs12345678");
updateBulkOps.updateOne(query1,update1);
//构建查询条件2
Query query2 = new Query();
query2.addCriteria(Criteria.where("username").is("zhsqaq"));
query2.addCriteria(Criteria.where("password").is("zhsqaq123456"));
Update update2 = new Update().set("password","zhsqaq12345678");
updateBulkOps.updateOne(query2,update2);
...
//执行这个操作
updateBulkOps.execute();

8,数据查询

查询这块方式比较多也比较简单,接下来讲解集中简单的查询方式,如下直接查询全部文档

List<User> userList = mongoTemplate.findAll(User.class);

也可以通过Query构造条件查询,并通过这 Criteria 条件构造条件去筛选数据

Query query2 = new Query();
query2.addCriteria(Criteria.where("username").is("zhsqaq"));
query2.addCriteria(Criteria.where("password").is("zhsqaq123456"));
mongoTemplate.find(query, User.class)

除了上面的is,还有可多api都是可用的,如一些基本操作ne,lt ,lte ,gt , gte 等等,基本操作运算符和比较运算符里面都有的

在这里插入图片描述

还支持在查询条件中增加排序功能,支持升序和降序,如下面这条根据创建时间升序排序

query.with(Sort.by(Sort.Order.asc("createdTime")));

同时支持分页功能,如继续给查询条件中返回前100条数据

query.skip(0).limit(100);

获取某个集合总文档的个数如下

mongoTemplate.count(query,User.class);

9,数据删除

数据删除就比较简单,只需要构造查询的条件,调用remove方法就可以直接将数据删除,如删除用户名为zhs的用户的数据

Query query = new Query();
query.addCriteria(Criteria.where("username").is("zhs"));
mongoTemplate.remove(query,User.class); //删除符合的数据

到此为止spring Boot整合mongodb算是入门成功

除就比较简单,只需要构造查询的条件,调用remove方法就可以直接将数据删除,如删除用户名为zhs的用户的数据

Query query = new Query();
query.addCriteria(Criteria.where("username").is("zhs"));
mongoTemplate.remove(query,User.class); //删除符合的数据

到此为止spring Boot整合mongodb算是入门成功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elixir学习笔记——输入输出和文件系统

本章介绍输入/输出机制、文件系统相关任务以及相关模块&#xff08;如 IO、File 和 Path&#xff09;。IO 系统提供了一个很好的机会来阐明 Elixir 和 Erlang VM 的一些思维模式和新奇思想。 输入输出模块 输入输出模块是 Elixir 中读写标准输入/输出 (:stdio)、标准错误 (:s…

Linux 终端窗口设置为透明

Linux 终端窗口设置为透明 打开终端 右键鼠标 选择Profile Preferences 点击Background 选择 Transparent background 拖动滑条调整透明度 完成。

【机器学习】集成学习方法:Bagging与Boosting的应用与优势

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、集成学习的定义二、Bagging方法1. 随机森林&#xff08;Random Forest&#xff09;2. 其他Bagging方法 二、Boosting方法1. 梯度提升树&#xff08;Gradient Boosting Machine, GBM&#xff09;解释GBM的基本原理和…

笔记本开机原理

从按下开机键开始&#xff0c;机器是如何开到OS的呢&#xff1f;今天这篇文章和大家极少EC-BIOS-OS的整个开机流程。首先大家要对笔记本的基本架构有所了解&#xff0c;基本架构如下图所示&#xff08;主要组成部分为大写黑体内容&#xff09;。 一、按下PowerButton按钮&#…

手把手带你搞定用户权限控制 | 纯干货

在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、角色、菜单这三个部分展开。 如何设计…

Matlab的Simulink系统仿真(simulink调用m函数)

这几天要用Simulink做一个小东西&#xff0c;所以在网上现学现卖&#xff0c;加油&#xff01; 起初的入门是看这篇文章MATLAB 之 Simulink 操作基础和系统仿真模型的建立_matlab仿真模型搭建-CSDN博客 写的很不错 后面我想在simulink中调用m文件 在 Simulink 中调用 MATLA…

Git 基础操作(一)

Git 基础操作 配置Git 安装完Git后&#xff0c;首先要做的事情是设置你的 用户名 和 e-mail 地址。这样在你向仓库提交代码的时候&#xff0c;就知道是谁提交的&#xff0c;以及提交人的联系方式。 配置用户名和邮箱 使用git config [--global] user.name "你的名字&qu…

失眠焦虑?这些维生素或许能帮你找回好眠!

&#x1f4a4; 失眠、焦虑&#xff0c;是现代生活中不少人都可能遇到的问题。长期的失眠与焦虑&#xff0c;不仅影响身体健康&#xff0c;更会对精神状态造成不小的冲击。其实&#xff0c;除了调整作息和放松心情&#xff0c;适当的维生素补充也可能有助于改善这些症状。 &…

SpringCloud-远程调用OpenFeign-基本使用

目录 1 直接使用RestTemplate发起Http请求 1.1 将RestTemplate注册为SpringBean 1.2 在service实现类中注入RestTemplate 1.3 使用注入的RestTemplate 传入参数后发起http请求 2 引入Nacos后使用RestTemplate发起Http请求 2.1 基础知识 2.2 Nacos的使用 2.2.1 引入nac…

Hvv--知攻善防应急响应靶机--Linux2

HW–应急响应靶机–Linux2 所有靶机均来自 知攻善防实验室 靶机整理&#xff1a; 夸克网盘&#xff1a;https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘&#xff1a;https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP&#xff1a;https://mp.weixin.…

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

&#x1f340;简介 Options是.net Core Web api框架自带的功能&#xff0c;Options模式通过定义强类型的类来表示相关配置设置的集合&#xff0c;使得配置管理更为结构化和类型安全。 IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许…

Jenkins三种构建类型

目录 传送门前言一、概念二、前置处理&#xff08;必做&#xff09;1、赋予777权限2、让jenkins用户拥有root用户的kill权限3、要运行jar包端口号需要大于1024 三、自由风格软件项目&#xff08;FreeStyle Project&#xff09;&#xff08;推荐&#xff09;三、Maven项目&#…

【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常

【问题分类】驱动使用 【关键字】OCI、驱动使用、PHP 【问题描述】 PHP使用OCI8连接yashan数据库&#xff0c;使用绑定参数获取数据时&#xff0c;出现报错 如果使用PDO_OCI接口连接数据库&#xff0c;未弹出异常&#xff0c;但是无法正确获取数据 【问题原因分析】 开启O…

springcloud第4季 分布式事务seata作用服务搭建

一 seata作用 1.1 作用 二 seata服务端搭建 2.1 seata搭建 2.2.1 seata 服务端下载安装 下载地址&#xff1a; Seata-Server下载 | Apache Seata 截图如下&#xff1a; 2.2.2 使用mysql初始化seata所需表 1.下载脚本地址&#xff1a;incubator-seata/script/server/db/…

2024最新D卷 华为OD统一考试题库清单(按算法分类),如果你时间紧迫,就按这个刷

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

Nas实现软路由OpenWrt安装

文章目录 基本配置步骤 基本配置 NAS&#xff1a;TS-264C 宇宙魔方 步骤 1.下载软路由OpenWrt 下载地址&#xff1a;https://openwrt.org/ 2.下载好以后&#xff0c;需要下载虚拟盘转换工具&#xff08;StarWind V2V Convert&#xff09; 下载地址&#xff1a;https://…

大模型与知识智能:心理疾病治疗的新希望

前言 随着社会的发展&#xff0c;心理疾病已成为一个日益突出的问题。据《柳叶刀》杂志的系统性综述显示&#xff0c;疫情之后&#xff0c;全世界抑郁症与焦虑症的患病率上升超过25%&#xff0c;其中青少年心理健康的影响最大。此外&#xff0c;2021年国内的精神障碍报告显示&…

Docker 镜像库国内加速的几种方法

在国内&#xff0c;拉取 Docker 镜像速度慢 / 时不时断线 / 无账号导致限流等&#xff0c;比较痛苦。 这里提供几个当前可用的镜像仓库&#xff0c;更新到/etc/docker/daemon.json即可。 更新完记得运行&#xff1a; sudo systemctl daemon-reload sudo systemctl restart …

以keepalived为例说明程序不能正常被gdb调试的原因

现象 通过gdb att $keepalived_pid发起对当前运行keepalived的调试&#xff1b; 在放行keepalived继续执行后&#xff0c;想通过CtrlC按键中断执行&#xff0c;观察下被调试程序的当前内部状态&#xff0c; 但是&#xff0c;在终端输入CtrlC后&#xff0c;导致keepalived被调…

一般简单的功能使用GIS 服务器工具还需要进行扩展开发吗?

有网友困惑怎么使用了我们的 GIS 服务器工具&#xff0c;一些简单的功能需不需要对服务器进行扩展开发&#xff1f;下面我们首先看一下标准GIS WEB服务器例如GEOSERVER&#xff0c;QGISSERVER、GIS数据快捷共享发布工具&#xff08;建立自己的地图网站&#xff09;及其它一些商…