前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 MongoTemplate 对 MongoDB 进行 CRUD

使用 MongoTemplate 对 MongoDB 进行 CRUD

作者头像
码农UP2U
发布于 2021-10-14 02:38:37
发布于 2021-10-14 02:38:37
1.7K00
代码可运行
举报
文章被收录于专栏:码农UP2U码农UP2U
运行总次数:0
代码可运行

早期文章

MongoDB 是一个基于分布式文件存储数据库,由 C++ 编写,它是可扩展的高性能数据存储解决方案。来看一下 MongoDB 官网对于 MongoDB 的简单介绍。

一、MongoDB 使用简介

在 MongoDB 中,它的一些名词与关系型数据库的名词不太相同,我引入一张图供大家进行参考,如下图所示。

该图片来自如下网址: https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html

在 MongoDB 中,集合就相当于关系型数据库中表的概念,但是它和表又不一样。因为同一个集合下可以存储不同的数据,且集合与集合之间不存在关联关系。它也没有列的概念,在使用 MongoDB 时无需提前定义它的列与数据类型(尽管实际使用中还是会通过实体类定义一下),没有列的概念,那么每一行的数据可以存储意义上完全不同的数据,比如商品详情信息,可以把手机和电脑放入一个集合,但是手机和电脑的参数详情完全不同,对于 MongoDB 而言是没有问题的。

在对 MongoDB 做完简单的介绍后,再介绍几个 MongoDB 常用的命令:

1.查看 MongoDB 中的数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show dbs

2.选择数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use local

3.查看数据库中的集合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show collections

4.查看集合中的全部数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.startup_log.find()

更多的使用命令,可以参考 MongoDB 的文件进行学习了解。

二、在 SpringBoot 中引入依赖

在 SpringBoot 项目中使用 MongoDB,首先需要引入 MongoDB 的依赖,通过在 POM 文件中引入 MongoDB 的依赖坐标,即可将操作 MongoDB 的类库整合入 SpringBoot 项目当中,相关依赖如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

三、添加配置

引入依赖之后,需要在配置文件中添加 MongoDB 的地址,如同我们使用 MySQL 一样需要给出它的地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  data:
    mongodb:
      uri: mongodb://127.0.0.1:27017/test

在上面的 uri 中,test 指定了我们 Demo 中要操作的数据库。

四、定义对应 MongoDB 中集合的实体类

操作 MySQL 时,我们会将 MySQL 的表在项目中定义一个对应的实体类,操作 MongoDB 的集合也需要定义一个对应的实体类。这里定义一个 Student 的实体类作为 Demo 中的实体类来进行操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
@Document("Student")
public class Student {

    @Id
    private String id;
    private String name;
    private Integer age;
    private String email;
}

在实体类上添加注解 @Document,@Document 中给出的是集合的名称。注解 @Id 会将该字段与 MongoDB 生成的 _id 进行关联。

在具体操作 MongoDB 时可以通过 MongoTemplate 来进行操作,也可以通过 MongoRepository 来进行操作。下面我们将介绍如何使用 MongoTemplate 来完成对 MongoDB 的 CRUD 操作。

五、使用 MongoTemplate 完成 CRUD

MongoTemplate 基于 Spring 容器提供了一组对 MongoDB 操作的基本方法,只要将 MongoTemplate 注入到需要使用的类中,即可直接使用。

1.注入 MongoTemplate

创建一个测试类,通过 @Autowired 将 MongoTemplate 进行注入,代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
private MongoTemplate mongoTemplate;

2.添加操作

在注入 MongoTemplate 后,我们即可在测试类中完成 CRUD 的操作,先来完成一个添加数据的操作,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 添加操作
 */
@Test
void create() {
    for (int i = 0; i < 10; i ++) {
        Student student = new Student();
        student.setAge(20 + i);
        student.setName("test" + i);
        student.setEmail(i + "12345@qq.com");

        Student insert = mongoTemplate.insert(student);

        System.out.println(insert);
    }
}

通过 MongoTemplate 的 insert 方法,即可完成数据的插入操作。

执行上面的测试代码后,我们通过 MongoDB 的客户端来查看一下我们添加的数据。首先通过 show dbs 命令来查看 MongoDB 中的数据库,可以看到多了一个 test 数据库,如下图所示:

然后,使用 use 选择该数据库,使用 show collections 查看 test 下的集合,可以看到在 test 数据库下自动创建了一个 Student 的集合,如下图所示:

可以看到,在我们执行上面的方法之前,并没有去创建 test 数据库,也没有创建 Student 集合。执行了上面的代码后,会自动创建 test 数据库和 Student 集合,并且在 Student 集合中插入了 10 条文档。

3.查询集合中的所有记录

上面完成了文档数据插入的操作,现在通过 MongoTemplate 来将其全部查出,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 查询表中所有记录
 */
@Test
void findAll() {
    List<Student> all = mongoTemplate.findAll(Student.class);

    all.forEach(System.out::println);
}

通过 MongoTemplate 的 findAll 方法可以查询指定集合下的所有文档。

执行上面的代码后,在控制台会输出 Student 集合中的全部文档,输出内容如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Student(id=614c43b77fbbb70ee5016e52, name=test0, age=20, email=012345@qq.com)
Student(id=614c43b77fbbb70ee5016e53, name=test1, age=21, email=112345@qq.com)
Student(id=614c43b77fbbb70ee5016e54, name=test2, age=22, email=212345@qq.com)
Student(id=614c43b77fbbb70ee5016e55, name=test3, age=23, email=312345@qq.com)
Student(id=614c43b77fbbb70ee5016e56, name=test4, age=24, email=412345@qq.com)
Student(id=614c43b77fbbb70ee5016e57, name=test5, age=25, email=512345@qq.com)
Student(id=614c43b77fbbb70ee5016e58, name=test6, age=26, email=612345@qq.com)
Student(id=614c43b77fbbb70ee5016e59, name=test7, age=27, email=712345@qq.com)
Student(id=614c43b77fbbb70ee5016e5a, name=test8, age=28, email=812345@qq.com)
Student(id=614c43b77fbbb70ee5016e5b, name=test9, age=29, email=912345@qq.com)

从输出中可以看出,MongoDB 为我们生成了 id,通过这个 id 我们可以唯一的确定一条数据。

4.通过 id 查询指定的文档

通常,我们在查询指定的某条数据时会通过 id 进行查询,在添加数据时,可以看到 MongoDB 为我们自动生成了 id,名为 _id,只要通过 MongoTemplate 的 findById 方法,并传入相应的 id 值即可进行查询,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 根据 id查询
 */
@Test
void findById() {
    Student byId = mongoTemplate.findById("614c43b77fbbb70ee5016e52", Student.class);

    System.out.println(byId);
}

从上面的代码中可以看到,通过 MongoTemplate 的 findById 可以获取指定 id 的文档。

5.条件查询

MongoDB 支持非常强大的查询功能,这里简单的完成一个条件查询。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 条件查询
 */
@Test
void findUserList() {
    // name = test0 and age = 20
    Query query = new Query(
            Criteria.where("name").is("test0")
                    .and("age").is(20)
    );

    List<Student> users = mongoTemplate.find(query, Student.class);

    users.forEach(System.out::println);
}

在上面的代码中,Criteria 是 MongoTemplate 的标准查询接口,它可以把多个查询条件通过链式操作进行拼接,然后通过 Query 可以构建查询语句,上面的查询相当于如下 SQL 语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from student where name = 'test0' and age = 20

再来完成一个 or 的查询,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 条件查询
 */
@Test
void findUserList() {
    Query query = new Query(
            new Criteria().orOperator(
                    Criteria.where("name").is("test0").and("age").is(20),
                    Criteria.where("age").gt(25)
            )
    );

    List<Student> users = mongoTemplate.find(query, Student.class);

    users.forEach(System.out::println);
}

注意上面代码中关于 Criteria 的写法,上面的代码,相当于如下 SQL 语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from student where (name = 'test0' and age = 20) or (age > 25)

or 查询的输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Student(id=614c43b77fbbb70ee5016e52, name=test0, age=20, email=012345@qq.com)
Student(id=614c43b77fbbb70ee5016e58, name=test6, age=26, email=612345@qq.com)
Student(id=614c43b77fbbb70ee5016e59, name=test7, age=27, email=712345@qq.com)
Student(id=614c43b77fbbb70ee5016e5a, name=test8, age=28, email=812345@qq.com)
Student(id=614c43b77fbbb70ee5016e5b, name=test9, age=29, email=912345@qq.com)

通过上面的输出可以验证 or 查询的写法是正确的。

6.模糊查询

MongoDB 的模糊查询可以使用正则表达式来进行完成,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 模糊查询
 */
@Test
void findLikeUserList() {
    // name like test and age = 20

    String name = "est";
    String regex = String.format("%s%s%s", "^.*", name, ".*$");

    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

    Query query = new Query(
            Criteria.where("name").regex(pattern)
            .and("age").is(20)
    );

    List<Student> users = mongoTemplate.find(query, Student.class);

    users.forEach(System.out::println);
}

上面的代码中,在 Criteria.where 后面使用了 regex,而不是 is,就可以使用正则表达式来进行查询。上面的模糊查询相当于是 SQL 语句中的 like,由于我们的 name 字段中都能匹配到 est 字符串,这个例子也就没有太多的意义了。

7.分页查询

在 MySQL 中进行数据的分页查询,一般需要给接口传入页码和每页记录的条数,当然也需要传入一些查询条件。对于 MongoDB 而言,传入接口的数据也是一样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 分页查询
 */
@Test
void findPageUserList() {
    int pageNo = 2;
    int pageSize = 3;

    // 条件构件
    Query query = new Query(
            Criteria.where("age").gt(23)
    );

    // 分页构件
    // 查询记录数
    long count = mongoTemplate.count(query, Student.class);
    // 分页
    List<Student> users = mongoTemplate.find(
            query.skip((pageNo - 1) * pageSize)
                    .limit(pageSize),
            Student.class);

    System.out.println(count);
    users.forEach(System.out::println);
}

分页查询通过 query 的 skip 和 limit 进行完成,此处也类似于 MySQL 的 limit 的用法。上面的代码中,我们的分页每页显示 3 条,当前页是第 2 页。在代码的第 16 行,通过 MongoTemplate 的 count 获取了满足条件的记录总数,以上代码输出的数据如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
6
Student(id=614c43b77fbbb70ee5016e59, name=test7, age=27, email=712345@qq.com)
Student(id=614c43b77fbbb70ee5016e5a, name=test8, age=28, email=812345@qq.com)
Student(id=614c43b77fbbb70ee5016e5b, name=test9, age=29, email=912345@qq.com)

在我们的条件中,我们查询 age 大于 23 的,也就是从 24 到 29,一共有 6 条数据。前 3 条是 24 到 26,那么此处的数据显示是正确的。

8.修改数据

修改数据时首先对数据进行查询,然后设置需要修改的值,进行数据的更新。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 修改
 */
@Test
void updateUser() {
    // 根据id查询
    Student user = mongoTemplate.findById("614c43b77fbbb70ee5016e59", Student.class);

    // 设置修改值
    assert user != null;
    user.setName("zhangsan");
    user.setAge(30);
    user.setEmail("haha@qq.com");

    Query query = new Query(Criteria.where("_id").is(user.getId()));
    Update update = new Update();
    update.set("name", user.getName());
    update.set("age", user.getAge());
    update.set("email", user.getEmail());

    // 调用方法实现修改
    UpdateResult upsert = mongoTemplate.upsert(query, update, Student.class);

    System.out.println(upsert.getModifiedCount());
}

通过 MongoTemplate 的 upsert 方法可以对数据进行修改,修改后的数据如下图:

在上面的代码中,如果只需要更新 name 或 age 或 email 中的一个,那么只需要设置其中一个值即可,无需全部进行 set。

9.删除数据

删除操作同样通过 Query 类构造要删除的条件,然后调用 remove 方法进行删除即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 删除操作
 */
@Test
void deleteUser(){
    Query query = new Query(Criteria.where("_id").is("614c43b77fbbb70ee5016e59"));

    DeleteResult remove = mongoTemplate.remove(query, Student.class);

    System.out.println(remove.getDeletedCount());
}

通过 MongoTemplate 的 remove 方法,我们删除了一条数据,通过 db.Student.find() 命令进行查看,可以看到刚才更新过的 zhangsan 那条数据已经被删除了。调用 remove 方法后,会返回 DeleteResult 对象,通过该对象调用 getDeletedCount 方法可以获得删除的记录数。

六、总结

MongoDB 已经被越来越多的使用,它适合于对大量的、无固定数据结构的数据进行存储。本文简单的介绍了通过使用 MongoTemplate 来对 MongoDB 进行 CRUD 的操作。下次来介绍通过 MongoRepository 对 MongoDB 的 CRUD 操作。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农UP2U 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot高级篇MongoDB之如何新增文档
MongoDB一个基本数据称为document,和mysql不一样,没有强制约束哪些字段,可以随意的插入,下面是一个简单的插入演示
一灰灰blog
2019/05/26
1.4K0
让 MongoDB 的 CRUD 有 JPA 的味道
文末提供我整理的 SpringBoot 整合、操作 MongoDB 文档的下载方式!!!
码农UP2U
2021/10/14
1.9K0
让 MongoDB 的 CRUD 有 JPA 的味道
[Java基础篇]Spring Boot整合MongoDB
1970 年 EFCodd 提出的关系模型的论文“Arelational model of data for large shared databases”,这部分数据有很大一部分关系数据库管理系统(RDBMS)来。简单。
苏州程序大白
2022/04/14
1.1K0
[Java基础篇]Spring Boot整合MongoDB
【开发日记】SpringBoot中使用MongoDB
1、引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 2、配置项 spring: data: # MongoDB数据库 mongodb: host: 127.0.0.1 # 连接地址 port: 27017 #
全栈开发日记
2022/08/30
3360
Spring Data MongoTemplate简介及示例
最近手头上的项目使用mongoDB存储物联网设备采集上来的实时数据,增删改查与传统关系数据库差别很大,开发过程中也踩了不少坑,记录下来供有需要的朋友参考。
程序你好
2022/11/18
4.9K0
Spring Data MongoTemplate简介及示例
SpringBoot之MongoTemplate的查询可以怎么耍
学习一个新的数据库,一般怎么下手呢?基本的CURD没跑了,当可以熟练的增、删、改、查一个数据库时,可以说对这个数据库算是入门了,如果需要更进一步的话,就需要了解下数据库的特性,比如索引、事物、锁、分布式支持等
一灰灰blog
2019/05/26
3.2K0
【探花交友】day04—圈子功能实现
地址:http://192.168.136.160:3000/project/19/interface/api/118
陶然同学
2023/04/08
1.1K0
【探花交友】day04—圈子功能实现
Spring Boot中快速操作Mongodb
在Spring Boot中集成Mongodb非常简单,只需要加入Mongodb的Starter包即可,代码如下:
猿天地
2018/07/25
3.8K0
springBoot系列教程02:mongodb的集成及使用
更多命令请参考https://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html
肖哥哥
2018/08/02
4680
springBoot系列教程02:mongodb的集成及使用
MongoDB
​ MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
OY
2022/09/28
4.8K0
MongoDB
MongoDB入门(特点,使用场景,命令行操作,SpringData-MongoDB)
今天我们将通过这一篇博客来了解MongoDB的体系结构,命令行操作和在JAVA 当中使用SpringData-MongoDB 来 操作MongoDB。
叫我阿杰好了
2023/02/02
1.3K1
MongoDB入门(特点,使用场景,命令行操作,SpringData-MongoDB)
SpringBoot 整合 MongoDB 实现数据的增删改查!
在之前的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,我们一起在回顾一下。
Java极客技术
2023/02/23
4.2K0
SpringBoot 整合 MongoDB 实现数据的增删改查!
spring data mongodb dbref 关联查询
今天我们学习下DBRef的使用,用过mongodb的都知道mongodb不能做关联查询,关系型数据库中是可以的,当然我们不要用关系型数据库的思想来用nosql。 但是实际应用中也是会有类似的需求的。 我们就以学生和班级的关系来讲解一对一以及一对多的关联操作。 一个班级有多个学生,班级对学生是一对多的关系 一个学生属于一个班级,学生对班级是一对一的关系 如果用mysql那么就是下面2张表: 班级表: classId className 学生表: studentId studentName classId 查询
猿天地
2018/04/03
4.5K0
Spring Data CRUD(MongoDB)
对数据库的操作一定要放在@Service 类中,而不是放在 @Controller 类中;且 @Controller 类可以调用 @Service 类的方法,反之则不行。这是 SpringMVC的经典架构理论。
摸鱼的G
2023/02/22
7040
使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。本文介绍使用Spring Data MongoDB来访问mongodb数据库的几种方法: 使用Query和Criteria类 JPA自动生成的查询方法 使用@Query 注解基于JSON查询 在开始前,首先需要引入maven依赖 1.1 添加Maven的依赖 如果您想使用Spring Data MongoDB,则需要将以下条目添加到您的pom.xml文件中: <dependen
JadePeng
2018/03/12
2.8K0
MongoDB分页的Java实现和分页需求的思考
传统关系数据库中都提供了基于row number的分页功能,切换MongoDB后,想要实现分页,则需要修改一下思路。
Ryan-Miao
2018/08/01
4.5K0
MongoDB分页的Java实现和分页需求的思考
spring-data-mongodb之MongoTemplate 修改数据
今天我们学习如何使用spring-data-mongodb来对集合中的数据进行修改操作 首先准备要练习的数据2条,实体类Article的定义请参考之前的文章spring-data-mongodb之MongoTemplate 添加数据 { "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate的基本使用", "url": "http://cxytiandi.com/blog/detail/0",
猿天地
2018/04/03
4.2K0
恕我直言,牛逼哄哄的MongoDB你可能只会30%
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
Bug开发工程师
2020/02/14
1.1K0
spring-data-mongodb之查询操作
查询,无论是关系型数据库还是mongodb这种nosql,都是使用比较多的,大部分操作都是读的操作。 mongodb的查询方式很多种,下面只列了一些常用的,比如: 1.=查询 2.模糊查询 3.大于小于范围查询 4.in查询 5.or查询 6.查询一条,查询全部 7.自己慢慢学习... 根据作者查询所有符合条件的数据,返回List<Article> Query query = Query.query(Criteria.where("author").is("yinjihuan"));List<Articl
猿天地
2018/04/03
2.5K0
SpingBoot 整合 MongoDB
首先,要在类上追加 @Document(collection = “集合名”) ,指定集合
收心
2022/01/17
5650
相关推荐
SpringBoot高级篇MongoDB之如何新增文档
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验