【MongoDB】万字长文,命令与代码一一对应SpringBoot整合MongoDB之MongoTemplate

news2024/12/22 23:02:07

目录

一、导入依赖与配置信息

二、导入测试数据创建实体类

三、插入数据

1、Insert默认集合插入

2、Insert指定集合插入 

3、Insert批量插入数据 

 4、save默认集合插入

5、save指定集合插入 

6、insert与save的区别 

四、修改数据

1、修改符合条件的第一条数据

2、全部修改

五、删除数据

1、删除满足条件的所有文档

2、删除集合里所有文档

3、删除满足条件的单个文档并返回

4、删除满足条件的所有文档并返回

六、查找数据

1、查询全部文档

2、查询指定id的文档

3、查询满足条件的一条文档

4、查询满足条件的所有文档

5、And查询

6、Or查询

7、In查询

8、比较查询

9、正则查询

10、排序查询

11、分页查询

12、统计查询


一、导入依赖与配置信息

首先我们需要在项目中导入所需要的依赖,有两种方式:在项目创建之初选择对应的依赖

image.png

如果项目已经创建则在pom.xml文件中加入以下依赖

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

在依赖导入后,我们需要在项目的配置文件中配置相对应的信息

spring:
  data:
    mongodb:
      host: IP
      port: 27017
      database: 数据库

二、导入测试数据创建实体类

在MongoDB中导入数据

db.comment.insertMany([{_id:"1",nickname:"zs",content:"这是一本好书",userId:1,createTime:"2021-01-01T00:00:00",like:1,parentId:0},{_id:"2",nickname:"ls",content:"可是一本好书",userId:2,createTime:"2021-01-01T12:00:00",like:11,parentId:0},{_id:"3",nickname:"ls",content:"不是一本好书",userId:2,createTime:"2021-01-11T12:00:00",like:111,parentId:0}])

创建对应的实体类

package com.example.demo.pojo.mongodbVo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
@Document(collection = "comment")
public class Comment implements Serializable {
    @Id
    private String id;
    private String nickname;
    private String content;
    @Indexed
    private Integer userId;
    private LocalDateTime createTime;
    private Integer like;
    private Integer parentId;
}

三、插入数据

1、Insert默认集合插入

命令:db.comment.insert({_id:"4",nickname:"ww",content:"这位是谁啊",userId:3,createTime:……})

这种方式插入数据会插入到实体类上Document注解对应的集合中

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        Comment comment = new Comment("4","ww","这位是谁啊",3, LocalDateTime.now(),1,0);
        mongoTemplate.insert(comment);
    }
}

2、Insert指定集合插入 

命令:db.comment.insert({})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 构建数据
        Comment comment = new Comment("5","ww","这位是老师",3, LocalDateTime.now(),1,0);
        // 2. 存储数据库
        mongoTemplate.insert(comment,"comment");
    }
}

3、Insert批量插入数据 

命令:db.comment.insert([{},{}])

使用insert进行批量插入时必须指定集合名

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 构建数据
        Comment comment1 = new Comment("4","ww","这位是老师啊",3, LocalDateTime.now(),1,0);
        Comment comment2 = new Comment("6","ww","这位是啊",3, LocalDateTime.now(),1,0);
        List<Comment> list = new ArrayList<>();
        list.add(comment1);
        list.add(comment2);

        // 2. 存储数据库
        mongoTemplate.insert(list,"comment");
    }
}

 4、save默认集合插入

命令:db.comment.save({})

使用save进行插入时会根据id进行判断,如果要插入数据中的id在数据库存在,则会将旧的数据覆盖,如果不存在则插入数据

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 构建数据
        Comment comment = new Comment("4","ww","这位是老师啊12",3, LocalDateTime.now(),1,0);
      

        // 2. 存储数据库
        mongoTemplate.save(comment);
    }
}

5、save指定集合插入 

命令:db.comment.save({})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 构建数据
        Comment comment = new Comment("4","ww","这位是老师啊12",3, LocalDateTime.now(),1,0);
      

        // 2. 存储数据库
        mongoTemplate.save(comment,"comment");
    }
}

6、insert与save的区别 

在MongoTemplate中,save()和insert()方法有以下区别:

  1. save()方法:save()方法用于插入新文档或更新现有文档。如果要保存的文档没有id字段,将插入一个新文档。如果文档具有id字段,MongoDB将尝试使用匹配的id值更新文档。如果找不到具有匹配id的文档,则插入一个新文档。
     
  2. insert()方法:insert()方法用于向集合中插入新文档。如果要插入的文档已经具有id字段,并且集合中已经存在具有相同id值的文档,则会抛出异常。这确保插入的文档具有唯一的_id值。

    总结:save()方法用于插入和更新操作,而insert()方法专门用于插入新文档,并确保_id字段的唯一性。

四、修改数据

1、修改符合条件的第一条数据

命令:db.comment.update({},{})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 构建更新的数据
        Comment comment = new Comment("4","ww","这位是老师啊12",3, LocalDateTime.now(),1,0);

        // 2. 构建更新的条件
        Query query = new Query(Criteria.where("id").is(comment.getId()));

        // 3. 构建更新值
        Update update = new Update().set("content",comment.getContent()).set("createTime",comment.getCreateTime());

        // 4. 更新第一条满足条件的数据
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Comment.class);

        // 5. 判断是否更新
        System.out.println(update);
    }
}

2、全部修改

命令:db.comment.update({},{},{multi:true})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 构建更新的数据
        Comment comment = new Comment("4","ww","修改全部数据",3, LocalDateTime.now(),1,0);

        // 2. 构建更新的条件
        Query query = new Query(Criteria.where("nickname").is(comment.getNickname()));

        // 3. 构建更新值
        Update update = new Update().set("content",comment.getContent()).set("createTime",comment.getCreateTime());

        // 4. 更新第一条满足条件的数据
        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Comment.class);

        // 5. 判断是否更新
        System.out.println(update);
    }
}

五、删除数据

1、删除满足条件的所有文档

命令:db.comment.remove({})


@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 构建筛选条件
        Query query = new Query(Criteria.where("userId").is(2));

        // 2. 执行删除操作
        DeleteResult remove = mongoTemplate.remove(query, Comment.class);
    }
}

2、删除集合里所有文档

命令:db.comment.remove({})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 执行删除操作
        DeleteResult remove = mongoTemplate.remove(new Query(), Comment.class);
    }
}

3、删除满足条件的单个文档并返回

命令:db.comment.remove({})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 构建删除条件
        Query query = new Query(Criteria.where("userId").is(1));

        // 2. 删除数据接收返回的文档
        Comment andRemove = mongoTemplate.findAndRemove(query, Comment.class);

        // 3. 打印删除的文档
        System.out.println(andRemove);
    }
}

4、删除满足条件的所有文档并返回

命令:db.comment.remove({})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 删除所有满足条件并返回
        List<Comment> comments = mongoTemplate.findAllAndRemove(new Query(Criteria.where("userId").is(3)), Comment.class);

        // 2. 打印删除
        System.out.println(comments);
    }
}

六、查找数据

1、查询全部文档

命令:db.comment.find()

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询全部文档
        List<Comment> comments = mongoTemplate.findAll(Comment.class);
        // 2. 打印结果
        System.out.println(comments);
    }
}

2、查询指定id的文档

命令:db.comment.find({_id:"id"})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        Comment comment = mongoTemplate.findById("1", Comment.class);
        // 2. 打印结果
        System.out.println(comment);
    }
}

3、查询满足条件的一条文档

命令:db.comment.findOne({})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        Comment comment = mongoTemplate.findOne(new Query(Criteria.where("nickname").is("ww")),Comment.class);
        // 2. 打印结果
        System.out.println(comment);
    }
}

4、查询满足条件的所有文档

命令:db.comment.find({})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        List<Comment> comments = mongoTemplate.find(new Query(Criteria.where("nickname").is("ww")),Comment.class);
        // 2. 打印结果
        System.out.println(comments);
    }
}

5、And查询

命令:db.comment.find({$and:[{},{}]})

@SpringBootTest
public class PersonServiceTest {
 
    @Autowired
    private MongoTemplate mongoTemplate;
 
    @Test
    public void findByAndCondition() {
        // 1.创建将要and的条件
        Criteria criteriaNickName = Criteria.where("nickame").is("ww");
        Criteria criteriaLike = Criteria.where("like").is(1);
        // 2.将上面条件进行and关联
        Criteria criteria = new Criteria().andOperator(criteriaNickName, criteriaLike);
        // 3.条件对象添加到其中
        Query query = new Query(criteria);
        List<Comment> result = mongoTemplate.find(query, Comment.class);
        System.out.println("查询结果:" + result.toString());
    }
}

6、Or查询

命令:db.comment.find({$or:[{},{}]})

下面代码简写,具体可参照上述and写法,效果一致

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        List<Comment> comments = mongoTemplate.find(new Query(
                new Criteria().orOperator(
                        Criteria.where("nickname").is("ww"),
                        Criteria.where("like").is(10)
                )
        ), Comment.class);
        // 2. 打印结果
        System.out.println(comments);
    }
}

7、In查询

命令:db.comment.find({count:{$in:[11,12]}})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        List<Integer> ins = Arrays.asList(1,0,2);
        List<Comment> comments = mongoTemplate.find(new Query(Criteria.where("like").in(ins)), Comment.class);
        
        // 2. 打印结果
        System.out.println(comments);
    }
}

8、比较查询

命令:db.comment.find({ "like": { $gt: 0, $lt: 5 } })

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        Query query = new Query(Criteria.where("like").gt(0).lt(5));   // 查询大于0小于5
        List<Comment> comments = mongoTemplate.find(query, Comment.class);

        // 2. 打印结果
        System.out.println(comments);
    }
}

9、正则查询

命令:db.collectionName.find({ "nickname": { $regex: '^w' } })

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        List<Comment> comments = mongoTemplate.find(new Query(Criteria.where("nickname").regex("^w")), Comment.class);  // 查询nickname中w开头的数据

        // 2. 打印结果
        System.out.println(comments);
    }
}

10、排序查询

命令:db.collectionName.find({ "nickname": "ww" }).sort({ "like": 1 })

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        Query query = new Query(Criteria.where("nickname").is("ww")).with(Sort.by("id").descending());
        List<Comment> comments = mongoTemplate.find(query, Comment.class);

        // 2. 打印结果
        System.out.println(comments);
    }
}

 

11、分页查询

命令:db.comment.find({}).skip(2).limit(2)

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        Query query = new Query(Criteria.where("nickname").is("ww")).skip(2).limit(2);
        List<Comment> comments = mongoTemplate.find(query, Comment.class);

        // 2. 打印结果
        System.out.println(comments);
    }
}

12、统计查询

命令:db.comment.count({})

@SpringBootTest
class CommentServiceTest {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void testInsert() {
        // 1. 查询文档
        Query query = new Query(Criteria.where("nickname").is("ww"));
        long count = mongoTemplate.count(query, Comment.class);

        // 2. 打印结果
        System.out.println(count);
    }
}

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

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

相关文章

单例模式-java实现

介绍 单例模式的意图&#xff1a;保证某个类在系统中有且仅有一个实例。 我们可以看到下面的类图&#xff1a;一般的单例的实现&#xff0c;是属性中保持着一个自己的私有静态实例引用&#xff0c;还有一个私有的构造方法&#xff0c;然后再开放一个静态的获取实例的方法给外界…

golang内存对齐

为什么要内存对齐&#xff1f; CPU访问内存时&#xff0c;以CPU的位数为单位进行访问。 如果访问未对齐的内存&#xff0c;处理器需要做两次内存访问&#xff0c;对齐的内存的访问可能仅需要一次&#xff0c;利用内存对齐后提升读取速度。 golang结构体内存对齐规则 在代码编译…

MySql学习3:常用函数

常用字符串函数 CHAR_LENGTH(s)&#xff1a;返回字符串的长度 select *, char_length(name) as nameLength from emp;CONCAT(s1,s2…sn)&#xff1a;字符串拼接 select name,concat(name,入职时间&#xff1a;,entrydata) as 入职时间 from emp;CONCAT_WS(x, s1,s2…sn)&a…

24v转3.3v输出3A用什么芯片

问&#xff1a;客户需要一个能够将24V输入电压转换为3.3V输出电压&#xff0c;并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗&#xff1f;&#xff08;vin24v、5v&#xff0c;vout3.3v&#xff0c;Io1-3A&#xff09; 答&#xff1a;推荐使用…

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy 经典塔防游戏&#xff0c;可发布PC、Andoid、IOS、Web等 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88189987

【Spring Boot】Thymeleaf模板引擎 — Thymeleaf页面布局

Thymeleaf页面布局 熟悉Thymeleaf的语法和表达式后&#xff0c;后面开发起来会更加得心应手。接下来好好研究一下Thymeleaf如何实现完整的Web系统页面布局。 1.引入代码片段 在模板中经常希望包含来自其他模板页面的内容&#xff0c;如页脚、页眉、菜单等。为了做到这一点&a…

【从零开始学习JAVA | 三十九篇】深入多线程

目录 前言&#xff1a; ​1.线程的寿命周期​ 2.线程的安全问题 3.锁 同步代码块&#xff1a; 同步方法&#xff1a; 死锁&#xff1a; 4.生产者和消费者模式&#xff08;等待唤醒机制&#xff09; 总结&#xff1a; 前言&#xff1a; 当今软件开发领…

构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)

Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…

Echart(v5)实现中国地图区域图

一、需求背景 需要实现一个中国地图的区域图&#xff08;区域级别到市&#xff09;&#xff0c;并且指定区域可以高亮。 二、相关工具 1、中国的GeoJSON数据获取&#xff1a;DataV.GeoAtlas地理小工具系列 2、Echart组件库 Apache ECharts 三、实现 echart配置&#xff1a; …

MySQL查看当前数据库视图-SQL语句

引言 查询语句为&#xff1a; show full tables where table_type 可查询当前数据库表 一&#xff0c;创建一个视图 # 创建视图 create view v_stu as # 视图内容&#xff08;连接的一个表&#xff09; select name from t_stu union all select tname from t_teach; 二&…

RISC-V云测平台:Compiling The Fedora Linux Kernel Natively on RISC-V

注释&#xff1a;编译Fedora&#xff0c;HS-2 64核RISC-V服务器比Ryzen5700x快两倍&#xff01; --- 以下是blog 正文 --- # Compiling The Fedora Linux Kernel Natively on RISC-V ## Fedora RISC-V Support There is ongoing work to Fedora to support RISC-V hardwar…

2.4 网络安全新技术

数据参考&#xff1a;CISP官方 目录 云计算安全大数据安全移动互联网安全物联网安全工业互联网安全 一、云计算安全 1、云计算定义 云计算是指通过网络访问可扩展的、灵活的物理或虚拟共享资源池&#xff0c;并按需自助获取和管理资源的模式。在云计算中&#xff0c;计算资…

Goland搭建远程Linux开发

Windows和Linux都需要先构建好go环境&#xff0c;启用ssh服务。 打开Windows上的Goland&#xff0c;建立项目。 点击添加配置&#xff0c;选择go构建 点击运行于&#xff0c;选择ssh 填上Linux机器的IP地址和用户名 输入密码 没有问题 为了不让每次运行程序和调试程序都生…

AIGC自动生成内容真的好吗

一、前言 博主认为某些技术领域的发展对人类而言&#xff0c;并没有多大的益处。反而让人类更加困扰。纵观这几十年的技术发展&#xff0c;日新月异&#xff0c;但是人类生活的幸福指数并没有提高&#xff0c;反而产生了无数的社会问题。 AI大模型迅速发展&#xff0c;A…

【Spring专题】手写简易Spring容器过程分析

前置知识 《【Spring专题】Spring底层核心原理解析》 思路整理 我们在上一节《【Spring专题】Spring底层核心原理解析》课里面有简单分析过一个Spring容器的一般流程&#xff0c;所以&#xff0c;本节课我们这里尝试写一下简易的Spring容器。 手写源码示例 一、手写前的准…

FirmAE 模拟固件

一、介绍 FirmAE目标是创造一个可以供用户动态调试分析的环境&#xff0c;而不是复现和硬件一模一样的环境,&#xff0c;其卖点是大规模(Large-Scale)。 论文开头就直指“友商”Firmadyne&#xff0c;提出其模拟成功率低等问题&#xff0c; 其将原本Firmadyne的成功率16.28%提高…

Navicat 导出excel表数据结构

效果展示&#xff1a; 实现过程&#xff1a; 1 打开Navicat 执行以下SQL&#xff0c;注意&#xff1a;将以下SQL中的数据库名称和表名称替换。 SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, C…

代码随想录算法学习心得 50 | 739.每日温度、496.下一个更大元素I...

一、每日温度 链接&#xff1a;力扣 描述如下&#xff1a;给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&…

pytest自动化测试框架之标记用例(指定执行、跳过用例、预期失败)

pytest中提供的mark模块&#xff0c;可以实现很多功能&#xff0c;如&#xff1a; 标记用例&#xff0c;即打标签skip、skipif标记跳过&#xff0c;skip跳过当前用例&#xff0c;skipif符合情况则跳过当前用例xfail标记为预期失败 标记用例 有时候我们可能并不需要执行项目中…

HTTP协议——应用层

HTTP协议 只要保证, 一端发送时构造的数据, 在另一端能够正确的进行解析, 就是ok的. 这种约定, 就是 应用层协议 HTTP简介 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;协议又叫做超文本传输协议&#xff0c;是一个简单的请求-响应协议&#xff0c;HTTP通常运行…