当前位置: 首页 > news >正文

【MongoDB】SpringBoot整合MongoDB

【MongoDB】SpringBoot整合MongoDB

文章目录

  • 【MongoDB】SpringBoot整合MongoDB
    • 0. 准备工作
    • 1. 集合操作
      • 1.1 创建集合
      • 1.2 删除集合
    • 2. 相关注解
    • 3. 文档操作
      • 3.1 添加文档
      • 3.2 批量添加文档
      • 3.3 查询文档
        • 3.3.1 查询所有文档
        • 3.3.2 根据id查询
        • 3.3.3 等值查询
        • 3.3.4 范围查询
        • 3.3.5 and查询
        • 3.3.6 or查询
        • 3.3.7 and or 查询
        • 3.3.8 排序
        • 3.3.9 分页查询
        • 3.3.10 查询总条数
        • 3.3.11 去重
        • 3.3.12 json字符串查询
      • 3.4 修改文档
      • 3.4.1 更新单条文档
        • 3.4.2 批量更新文档
        • 3.4.3 修改或插入文档
      • 3.5 删除文档
        • 3.5.1 删除所有文档
        • 3.5.2 条件删除

0. 准备工作

引入依赖:

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

1. 集合操作

1.1 创建集合

创建一个 ”products“ 集合,如果不存在则创建,存在则不创建。

@Test
public void createCollection() {//不存在集合则创建if (!mongoTemplate.collectionExists("products")) {mongoTemplate.createCollection("products");}
}

1.2 删除集合

@Test
public void dropCollection() {mongoTemplate.dropCollection("products");
}

2. 相关注解

  • @Document
    • 修饰范围:用在类上
    • 作用:用来映射这个类的一个对象为 mongo 中一条文档数据
    • 属性:{value、collection} 用来指定操作的集合名称
  • @Id
    • 修饰范围:用在成员变量、方法上
    • 作用:用来将成员变量的值映射为文档的 _id 的值
  • @Field
    • 修饰范围:用在成员变量、方法上
    • 作用:用来将成员变量以及值映射为文档中一个 key,value 对
    • 属性:{name,value} 用来指定在文档中key的名称,默认为成员变量名
  • @Transient
    • 修饰范围:用在成员变量、方法上
    • 作用:用来指定某个成员变量不参与文档的序列化

3. 文档操作

首先创建一个 User 类,给它一些基本属性。

@Data
@AllArgsConstructor
@NoArgsConstructor
//表示类实例代表mongo中一条文档
@Document("users")
public class User {private Integer id;private String name;private Double salary;private Date birthday;
}

3.1 添加文档

向 users 集合中添加文档:

@Test
public void saveDocument() {User user = new User(1, "zhj", 25000.0, new Date());//mongoTemplate.save(user);mongoTemplate.insert(user);
}
  • insert():插入重复数据时,该方法会报异常提示主键重复。
  • save():对已经存在的数据进行更新。它的功能就是 saveOrUpdate

3.2 批量添加文档

@Test
public void batchSaveDocument() {List<User> users = Arrays.asList(new User(3, "张三", 25000.0, new Date()), new User(4, "李四", 25000.0, new Date()));mongoTemplate.insert(users,User.class);
}

批量添加建议使用 insert() 方法,可以一次性插入整个数据,效率更高。


3.3 查询文档

image-20230717112130127


3.3.1 查询所有文档

List<User> users = mongoTemplate.findAll(User.class);
//List<User> users1 = mongoTemplate.findAll(User.class, "users");

3.3.2 根据id查询

User user = mongoTemplate.findById(1, User.class);

3.3.3 等值查询

List<User> users1 = mongoTemplate.find(Query.query(Criteria.where("name").is("zs")), User.class);

3.3.4 范围查询

List<User> users2 = mongoTemplate.find(Query.query(Criteria.where("salary").gt(30000)), User.class);

3.3.5 and查询

List<User> users3 = mongoTemplate.find(Query.query(Criteria.where("name").is("zs").and("salary").is(25000)), User.class);

3.3.6 or查询

Criteria criteria = new Criteria();
criteria.orOperator(Criteria.where("name").is("张三"),Criteria.where("name").is("李四")
);
List<User> users4 = mongoTemplate.find(Query.query(criteria), User.class);

3.3.7 and or 查询

List<User> users5 = mongoTemplate.find(Query.query(Criteria.where("salary").is(25000.0).orOperator(Criteria.where("name").is("zs"))), User.class);

3.3.8 排序

Query query = new Query();
query.with(Sort.by(Sort.Order.asc("id")));
List<User> users6 = mongoTemplate.find(query, User.class);

3.3.9 分页查询

Query pageQuery = new Query();
//查询第一页数据,每页展示两条数据
pageQuery.with(Sort.by(Sort.Order.desc("id"))).skip(0).limit(2);
List<User> users7 = mongoTemplate.find(pageQuery, User.class);

3.3.10 查询总条数

long count = mongoTemplate.count(new Query(), User.class);
System.out.println("总条数为:" + count);

3.3.11 去重

List<String> names = mongoTemplate.findDistinct(new Query(), "name", User.class, String.class);

3.3.12 json字符串查询

BasicQuery basicQuery = new BasicQuery("{name:'zs'}");
List<User> users8 = mongoTemplate.find(basicQuery, User.class);

3.4 修改文档

3.4.1 更新单条文档

Update update = new Update();
update.set("salary",300000.0);
//更新符合条件的第一条数据
mongoTemplate.updateFirst(Query.query(Criteria.where("name").is("zs")),update,User.class);

3.4.2 批量更新文档

Update update = new Update();
update.set("salary",300000.0);
//将所有满足条件的文档都修改
mongoTemplate.updateMulti(Query.query(Criteria.where("name").is("zs")),update,User.class);

3.4.3 修改或插入文档

Update update = new Update();
update.set("id",6);
update.set("salary", 300000.0);
//没有符合条件的数据,则插入数据
mongoTemplate.upsert(Query.query(Criteria.where("name").is("ls")),update,User.class);

如果没有包含”ls“这条文档,那么就会插入”ls“这条文档,但是如果id重复,那么就会抛出异常。

Update update = new Update();
update.set("salary", 300000.0);//没有符合条件的数据,则插入数据
UpdateResult upsert = mongoTemplate.upsert(Query.query(Criteria.where("name").is("ww")), update, User.class);//获取本次修改记录条数
long modifiedCount = upsert.getModifiedCount();
System.out.println(modifiedCount);
//获取本次匹配的记录条数
long matchedCount = upsert.getMatchedCount();
System.out.println(matchedCount);
//当集合种没有对应的文档,那么就插入文档,获得插入文档自动生成的id
System.out.println(upsert.getUpsertedId());

3.5 删除文档

3.5.1 删除所有文档

mongoTemplate.remove(new Query(),User.class);

3.5.2 条件删除

mongoTemplate.remove(Query.query(Criteria.where("name").is("ls")),User.class);

相关文章:

【MongoDB】SpringBoot整合MongoDB

【MongoDB】SpringBoot整合MongoDB 文章目录 【MongoDB】SpringBoot整合MongoDB0. 准备工作1. 集合操作1.1 创建集合1.2 删除集合 2. 相关注解3. 文档操作3.1 添加文档3.2 批量添加文档3.3 查询文档3.3.1 查询所有文档3.3.2 根据id查询3.3.3 等值查询3.3.4 范围查询3.3.5 and查…...

关于游戏引擎(godot)对齐音乐bpm的技术

引擎默认底层 1. _process(): 每秒钟调用60次&#xff08;无限的&#xff09; 数学 1. bpm1分钟节拍数量60s节拍数量 bpm120 60s120拍 2. 每拍子时间 60/bpm 3. 每个拍子触发周期所需要的帧数 每拍子时间*60(帧率&#xff09; 这个是从帧数级别上对齐拍子的时间&#x…...

【Go】实现一个代理Kerberos环境部分组件控制台的Web服务

实现一个代理Kerberos环境部分组件控制台的Web服务 背景安全措施引入的问题SSO单点登录 过程整体设计路由反向代理登录会话组件代理YarnHbase 结果 背景 首先要说明下我们目前有部分集群的环境使用的是HDP-3.1.5.0的大数据集群&#xff0c;除了集成了一些自定义的服务以外&…...

Spring Security 6.x 系列【63】扩展篇之匿名认证

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列Spring Security 版本 6.1.0 本系列Spring Authorization Server 版本 1.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 概述2. 配置3. Anonymo…...

供应链管理系统有哪些?

1万字干货分享&#xff0c;国内外 20款 供应链管理软件都给你讲的明明白白。如果你还不知道怎么选择&#xff0c;一定要翻到第三大段&#xff0c;这里我将会通过8年的软件产品选型经验告诉你&#xff0c;怎么样才能快速选到适合自己的软件工具。 &#xff08;为防后续找不到&a…...

如何在PADS Logic中查找器件

PADS Logic提供类似于Windows的查找功能&#xff0c;可以进行器件的查找。 &#xff08;1&#xff09;在Logic设计界面中&#xff0c;将菜单显示中的“选择工具栏”进行打开&#xff0c;如图1所示&#xff0c;会弹出对应的“选择工具栏”的分栏菜单选项&#xff0c;如图2所示。…...

Android 生成pdf文件

Android 生成pdf文件 1.使用官方的方式 使用官方的方式也就是PdfDocument类的使用 1.1 基本使用 /**** 将tv内容写入到pdf文件*/RequiresApi(api Build.VERSION_CODES.KITKAT)private void newPdf() {// 创建一个PDF文本对象PdfDocument document new PdfDocument();//创建…...

Kafka 入门到起飞 - 生产者发送消息流程解析

生产者通过send&#xff08;&#xff09;方法发送消息消息会经过拦截器->序列化器->分区器 进行加工然后将消息存在缓冲区当缓冲区中消息达到条件会按批次发送到broker对应分区上broker将接收到的消息进行刷盘持久化消息处理broker会返回给producer响应落盘成功返回元数据…...

基于单片机智能台灯坐姿矫正器视力保护器的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;LCD1602液晶显示当前当前光线强度、台灯灯光强度、当前时间、坐姿距离等&#xff1b;按键设置当前时间&#xff0c;闹钟、提醒时间、坐姿最小距离&#xff1b;通过超声波检测坐姿&#xff0c;当坐姿不正容易对眼睛和身体腰部等造成…...

欧姆龙以太网模块如何设置ip连接 Kepware opc步骤

在数字化和自动化的今天&#xff0c;PLC在工业控制领域的作用日益重要。然而&#xff0c;PLC通讯口的有限资源成为了困扰工程师们的问题。为了解决这一问题&#xff0c;捷米特推出了JM-ETH-CP转以太网模块&#xff0c;让即插即用的以太网通讯成为可能&#xff0c;不仅有效利用了…...

PLEX如何搭建个人局域网的视频网站

Plex是一款功能非常强大的影音媒体管理系统&#xff0c;最大的优势是多平台支持和界面优美&#xff0c;几乎可以在所有的平台上安装plex服务器和客户端&#xff0c;让你可以随时随地享受存储在家中的电影、照片、音乐&#xff0c;并且可以实现观看记录无缝衔接&#xff0c;手机…...

java学习02

一、基本数据类型 Java有两大数据类型&#xff0c;内置数据类型和引用数据类型。 内置数据类型 Java语言提供了八种基本类型。六种数字类型&#xff08;四个整数型&#xff0c;两个浮点型&#xff09;&#xff0c;一种字符类型&#xff0c;还有一种布尔型。 byte&#xff1…...

libcurl库使用实例

libcurl libcurl是一个功能强大的跨平台网络传输库&#xff0c;支持多种协议&#xff0c;包括HTTP、FTP、SMTP等&#xff0c;同时提供了易于使用的API。 安装 ubuntu18.04平台安装 sudo apt-get install libcurl4-openssl-dev实例 这个示例使用libcurl库发送一个简单的HTTP …...

大数据存储架构详解:数据仓库、数据集市、数据湖、数据网格、湖仓一体

前言 本文隶属于专栏《大数据理论体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见大数据理论体系 思维导图 数据仓库 数据仓库是一个面向主题的&…...

ESP32(MicroPython) 网页控制五自由度机械臂

ESP32&#xff08;MicroPython&#xff09; 网页控制五自由度机械臂 本程序通过网页控制五自由度机械臂&#xff0c;驱动方案改用PCA9685。 代码如下 #导入Pin模块 from machine import Pin import time from machine import SoftI2C from servo import Servos import networ…...

前端笔记_OAuth规则机制下实现个人站点接入qq三方登录

文章目录 ⭐前言⭐qq三方登录流程&#x1f496;qq互联中心创建网页应用&#x1f496;配置回调地址redirect_uri&#x1f496;流程分析 ⭐思路分解⭐技术选型实现&#x1f496;技术选型&#xff1a;&#x1f496;实现 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本…...

huggingface新作品:快速和简便的训练模型

AutoTrain Advanced是一个用于训练和部署最先进的机器学习模型的工具。它旨在提供更快速、更简便的方式来进行模型训练和部署。 安装 您可以通过PIP安装AutoTrain-Advanced的Python包。请注意&#xff0c;为了使AutoTrain Advanced正常工作&#xff0c;您将需要python > 3.…...

利用鸿鹄优化共享储能的SCADA 系统功能,赋能用户数据自助分析

摘要 本文主要介绍了共享储能的 SCADA 系统大数据架构&#xff0c;以及如何利用鸿鹄来更好的优化 SCADA 系统功能&#xff0c;如何为用户进行数据自助分析赋能。 1、共享储能介绍 说到共享储能&#xff0c;可能不少朋友比较陌生&#xff0c;下面我们简单介绍一下共享储能的价值…...

noSQL语句练习

Redis练习题 string list hash结构中&#xff0c;每个至少完成5个命令&#xff0c;包含插入 修改 删除 查询&#xff0c;list 和hash还需要增加遍历的操作命令 1、 string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; 127.0.0.1:63…...

Spring:Bean生命周期

Bean 生命周期生命周期 Bean 生命周期是 bean 对象从创建到销毁的整个过程。 简单的 Bean 生命周期的过程: 1.实例化(调用构造方法对 bean 进行实例化) 2.依赖注入(调用 set 方法对 bean 进行赋值) 3.初始化(手动配置 xml 文件中 bean 标签的 init-method 属性值,来指…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...