19、《Springboot+MongoDB整合:玩转文档型数据库》
Springboot+MongoDB整合:玩转文档型数据库
摘要:本文全面讲解Spring Boot与MongoDB的整合实践,涵盖环境搭建、CRUD操作、聚合查询、事务管理、性能优化等核心内容。通过15+个典型代码示例,演示如何高效操作文档数据库,深入剖析
MongoTemplate与MongoRepository的差异化使用场景,提供索引优化方案与分片集群配置实战经验,最后针对生产环境常见问题给出解决方案。
一、为什么选择MongoDB?
1.1 文档型数据库优势
- 灵活Schema设计:字段动态增减
- JSON结构存储:天然契合现代应用
- 高扩展性:分片集群轻松应对大数据
- 地理位置查询:内置GeoJSON支持
1.2 Spring Boot整合优势
- 自动配置:
spring-boot-starter-data-mongodb - 注解驱动开发:
@Document实体映射 - 丰富API支持:
MongoTemplate+Repository双模式 - 事务支持:跨文档ACID操作
二、环境准备与基础整合
2.1 Maven依赖配置
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!-- 测试环境支持 --><dependency><groupId>de.flapdoodle.embed</groupId><artifactId>de.flapdoodle.embed.mongo</artifactId><scope>test</scope></dependency>
</dependencies>
注意:嵌入式依赖用于单元测试,生产环境需连接真实MongoDB实例
2.2 配置文件示例
# application.properties
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=company
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.username=root
spring.data.mongodb.password=secret
2.3 实体类定义
@Document(collection = "employees")
public class Employee {@Idprivate String id;@Indexed(unique = true)private String employeeId;private String name;private String department;private LocalDateTime hireDate;@Field("compensation")private Salary salary; // 嵌套文档// getters/setters
}public class Salary {private BigDecimal base;private BigDecimal bonus;// 其他字段
}
注解说明:
@Document指定集合名称@Id标记主键字段@Indexed创建唯一索引@Field自定义字段映射
三、核心操作实践
3.1 Repository模式基础CRUD
public interface EmployeeRepository extends MongoRepository<Employee, String> {// 方法名自动推导查询List<Employee> findByDepartment(String department);@Query("{ 'hireDate' : { $gte: ?0 } }")List<Employee> findRecentHires(Date startDate);
}@Service
public class EmployeeService {@Autowiredprivate EmployeeRepository repository;public Employee createEmployee(Employee emp) {return repository.save(emp); // 插入或更新}public List<Employee> getDevTeam() {return repository.findByDepartment("Development");}
}
3.2 MongoTemplate高级操作
@Autowired
private MongoTemplate mongoTemplate;// 复杂更新操作
public void updateSalary(String empId, BigDecimal newBase) {Query query = new Query(Criteria.where("employeeId").is(empId));Update update = new Update().set("salary.base", newBase).currentDate("lastModified");mongoTemplate.updateFirst(query, update, Employee.class);
}// 聚合查询示例:统计部门平均工资
public List<DepartmentAvgSalary> getDepartmentAvgSalary() {Aggregation aggregation = Aggregation.newAggregation(Aggregation.group("department").avg("salary.base").as("avgSalary"),Aggregation.sort(Sort.Direction.DESC, "avgSalary"));return mongoTemplate.aggregate(aggregation, Employee.class, DepartmentAvgSalary.class).getMappedResults();
}
四、高级特性与优化
4.1 索引优化实战
// 程序化创建复合索引
@Configuration
public class MongoConfig {@Beanpublic IndexOperations employeeIndexOps(MongoTemplate template) {IndexOperations ops = template.indexOps(Employee.class);ops.ensureIndex(new Index().on("department", Sort.Direction.ASC).on("hireDate", Sort.Direction.DESC).named("dept_hire_idx"));return ops;}
}
4.2 事务管理
@Transactional
public void transferBonus(String fromEmp, String toEmp, BigDecimal amount) {// 扣减源员工奖金Query fromQuery = new Query(Criteria.where("employeeId").is(fromEmp));Update fromUpdate = new Update().inc("salary.bonus", amount.negate());mongoTemplate.updateFirst(fromQuery, fromUpdate, Employee.class);// 增加目标员工奖金Query toQuery = new Query(Criteria.where("employeeId").is(toEmp));Update toUpdate = new Update().inc("salary.bonus", amount);mongoTemplate.updateFirst(toQuery, toUpdate, Employee.class);
}
事务要求:
- MongoDB 4.0+ 版本
- 副本集部署模式
- 存储引擎为WiredTiger
五、性能优化与最佳实践
5.1 查询优化策略
-
投影优化:仅返回必要字段
Query.query(Criteria.where("department").is("Sales")).fields().include("name").include("salary"); -
批量写入:使用
bulkOps提升IO效率 -
连接池配置:
spring.data.mongodb.uri=mongodb://user:pass@host:port/db?maxPoolSize=50&waitQueueTimeoutMS=2000
5.2 生产环境注意事项
-
文档设计原则:
- 避免大文档(16MB限制)
- 合理使用引用与嵌入
- 预分配增长字段
-
分片策略选择:
- 基于范围分片:适合范围查询
- 哈希分片:保证均匀分布
- 复合分片键:平衡查询与分布
六、常见问题排查
6.1 典型错误场景
-
连接超时:
- 检查防火墙设置
- 验证认证信息
- 调整socketTimeoutMS参数
-
时区问题:
@Field(write = Write.DATE_STRING) private Date eventTime;或全局配置:
@Bean public MongoCustomConversions customConversions() {return new MongoCustomConversions(Arrays.asList(new DateToZonedDateTimeConverter(),new ZonedDateTimeToDateConverter())); } -
乐观锁冲突:
@Version private Long version; // 自动处理并发修改
总结
本文系统讲解了Spring Boot与MongoDB的整合要点,从基础配置到高级特性,覆盖了文档型数据库的核心使用场景。关键实践建议:
- 根据业务场景选择Repository或Template模式
- 建立合适的索引策略
- 合理设计文档结构
- 生产环境启用分片与副本集
- 关注驱动程序版本兼容性
最新整合方案已通过Spring Boot 3.2 + MongoDB 6.0验证,建议在实际开发中根据具体版本调整配置细节。
相关文章:
19、《Springboot+MongoDB整合:玩转文档型数据库》
SpringbootMongoDB整合:玩转文档型数据库 摘要:本文全面讲解Spring Boot与MongoDB的整合实践,涵盖环境搭建、CRUD操作、聚合查询、事务管理、性能优化等核心内容。通过15个典型代码示例,演示如何高效操作文档数据库,深…...
如何基于transformers库通过训练Qwen/DeepSeek模型的传统分类能力实现文本分类任务
文章目录 模型与环境准备文档分析源码解读模型训练及推理方式进阶:CPU与显存的切换进阶:多卡数据并行训练🔑 DDP 训练过程核心步骤🚫 DDP 不适用于模型并行⚖️ DDP vs. Model Parallelism⚙️ 解决大模型训练的推荐方法🎉进入大模型应用与实战专栏 | 🚀查看更多专栏…...
Unity中一个节点实现植物动态(Shader)
1 . 核心思路就操作顶点作往复运动; 核心代码: half stage1 dot(positionOS, float3(0, 1, 0)) * _Strength; half stage2 sin(dot(positionOS, float3(1, 0, 0)) * _Strength _Time.y * _Speed); half stage3 stage1 * stage2 * float3(0.001,…...
PrimeTime:工具简介
相关阅读 PrimeTimehttps://blog.csdn.net/weixin_45791458/category_12900271.html?spm1001.2014.3001.5482 PrimeTime是PrimeTime Suite中的一个工具,能够执行全芯片级、门级的静态时序分析,这是芯片设计和分析流程中的一个关键部分。该工具通过检查…...
FFmpeg+WebSocket+JsMpeg实时视频流实现方案
之前写的使用FFmpeg Nginx HLS流媒体播放方案,适合对实时性要求不高的需求,存在延迟,FFmpeg需要将视频流存储到本地文件,而本次方案FFmpeg不需要将视频流存储到本地文件,而是直接将转换后的视频流(如MJPE…...
《论系统需求分析方法》写作心得 - 系统分析师
系统需求分析方法论述 一、项目概述及本人职责 本人曾参与一项企业级客户关系管理系统(CRM)的开发项目,担任系统分析师的角色。该项目旨在为企业提供一个集客户信息管理、销售过程跟踪、客户服务支持于一体的综合管理平台,以提升…...
DuodooBMS源码解读之 mrp_management模块
制造管理扩展模块用户使用手册 一、模块概述 本扩展模块是基于 Odoo 18 开发的制造管理模块,主要为用户提供了更为强大和细致的制造管理功能。该模块添加了数量验证功能,即当一步工序未完成时,开始下一步工序,则下一步工序的生产…...
rust笔记8-Deref与隐式解引用强制转换
Rust 的智能指针和 Deref Trait 是 Rust 中非常重要的概念,它们使得 Rust 的引用和指针操作更加灵活和安全。下面我们将深入介绍 Deref Trait、Deref 与 &、* 运算符的关系,以及 Rust 的隐式解引用强制转换(Deref Coercion)。 1. 智能指针与 Deref Trait 智能指针(如…...
【拜读】Tensor Product Attention Is All You Need姚期智团队开源兼容RoPE位置编码
姚期智团队开源新型注意力:张量积注意力(Tensor Product Attention,TPA)。有点像一种「动态的LoRA」,核心思路在于利用张量分解来压缩注意力机制中的 Q、K、V 表示,同时保留上下文信息,减少内存…...
Docker-技术架构演进之路
目录 一、概述 常见概念 二、架构演进 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 三、尾声 一、概述 在进行技术学习过程中&am…...
用Chrome Recorder轻松完成自动化测试脚本录制
前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…...
python中的异常-模块-包
文章目录 异常异常的定义异常捕获语法捕获常规异常捕获指定异常捕获多个异常捕获所有异常异常else异常finally 异常传递总结 模块概念导入自定义模块及导入main方法all变量 总结 包自定义包定义pycharm中建包的基本步骤导入方式 第三方包 异常 异常的定义 当检测到一个错误时…...
【GPU驱动】OpenGLES图形管线渲染机制
OpenGLES图形管线渲染机制 OpenGL/ES 的渲染管线也是一个典型的图形流水线(Graphics Pipeline),包括多个阶段,每个阶段都负责对图形数据进行处理。管线的核心目标是将图形数据转换为最终的图像,这些图像可以显示在屏幕…...
ssm-day06 ssm整合
从springMVC总结再回顾一下 60节 整合就是应用框架,并且把这个框架放到IOC容器中 web容器:装springMVC和controller相关的web组件 root容器:装业务和持久层相关的组件 子容器可以引用父容器中的组件,父容器不能调子容器 一个容器…...
AI 编程助手 cursor的系统提示词 prompt
# Role 你是一名极其优秀具有10年经验的产品经理和精通java编程语言的架构师。与你交流的用户是不懂代码的初中生,不善于表达产品和代码需求。你的工作对用户来说非常重要,完成后将获得10000美元奖励。 # Goal 你的目标是帮助用户以他容易理解的…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_process_options
ngx_process_options 声明在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); 定义在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle) {u_char *p;size_t len;if (ngx_prefix) {len ngx_strlen(ngx_prefix);p …...
ollama如何安全卸载,解决Ollama unins000.msg is missing
春节后在本地电脑安装了Ollama的客户端,每次开机自启,影响开机速度,而且本地的模型不如联网的回答效果好,果断选择了卸载,但是今天卸载发现提示下方的错误。根据此文章可以解决当前的问题。 根据此文章可以解决当前的…...
网络安全设备防护原理 网络安全防护装置
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 防火墙 简介 网络层的防护设备,依照特殊的规则允许或者限制传输的数据通过 是由软件和硬件设备组合而成,在内部网和外部网之间、专用网…...
Python的那些事第二十八篇:数据分析与操作的利器Pandas
Pandas:数据分析与操作的利器 摘要 Pandas是基于Python的开源数据分析库,广泛应用于数据科学、机器学习和商业智能等领域。它提供了高效的数据结构和丰富的分析工具,能够处理结构化数据、时间序列数据以及复杂的数据转换任务。本文从Pandas的基础概念入手,深入探讨其核心…...
学习threejs,使用MeshBasicMaterial基本网格材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshBasicMaterial 二…...
【git-hub项目:YOLOs-CPP】本地实现05:项目移植
ok,经过前3个博客,我们实现了项目的跑通。 但是,通常情况下,我们的项目都是需要在其他电脑上也跑通,才对。 然而,经过测试,目前出现了2 个bug。 项目一键下载【⬇️⬇️⬇️】: 精…...
Html5学习教程,从入门到精通,HTML5 元素语法知识点及案例代码(2)
HTML5 元素语法知识点及案例代码 一、HTML5 元素概述 HTML5 元素是构成网页的基本单位,每个元素都有特定的语义和功能。HTML5 元素由开始标签、内容和结束标签组成,例如: <p>这是一个段落。</p><p> 是开始标签这是一个段…...
【python】协程(coroutine)
协程(coroutine)可以理解为一个可以中途暂停保存当前执行状态信息并可以从此处恢复执行的函数,多个协程共用一个线程执行,适合执行需要“等待”的任务。 所以严格意义上,多个协程同一时刻也只有一个在真正的执行&#…...
【编译器】-LLVMIR
概述 LLVM 是一种基于静态单赋值 (SSA) 的表示形式,提供类型安全、低级操作、灵活性以及干净地表示“所有”高级语言的能力。 LLVM IR 是一门低级语言,语法类似于汇编任何高级编程语言(如C)都可以用LLVM IR表示基于LLVM IR可以很…...
java面试场景问题
还在补充,这几天工作忙,闲了会把答案附上去,也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1:基于唯一请求 ID(幂等 Token) 思路:前端生成 一个唯一的 requestId(…...
算法菜鸡备战3月2日传智杯省赛----0221
2209. 用地毯覆盖后的最少白色砖块 - 力扣(LeetCode) 力扣每日一题 class Solution { public:// 白色最少 黑色最多int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {int n floor.size();// 记忆化搜索vector memo(n 1, vector&…...
python pandas下载
pandas pandas:就是一个可以处理数据的 python 库 核心功能: 数据的清洗:处理丢失值,重复值数据分析:计算和统计信息,或分组汇总数据可视化:结合 图标库(Matplotlib)完成数据可视化…...
高斯牛顿法(GN)与列文伯格-马夸尔特方法在ORB-SLAM3中的应用
问题背景 高斯牛顿法(Gauss-Newton, GN)和列文伯格-马夸尔特方法(Levenburg-Marquadt, LM)是两种最常用的非线性优化方法,这两种方法在ORB-SLAM3系统中均有使用。 在ORB-SLAM3前端跟踪线程(Tracking)中,局…...
Python+Selenium+Pytest+POM自动化测试框架封装
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、测试框架简介 1)测试框架的优点 代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一些高…...
猿大师中间件:网页直接内嵌本机EXE、OCX控件、ActiveX控件或桌面应用程序神器
猿大师中间件自从2019年发布以来,迄今为止不断迭代升级,给第三方提供了将自己的桌面程序和OCX控件支持直接内嵌到浏览器网页运行的赋能SDK开发包。 目前针对不同需求发布了三个成熟且商用的产品: 猿大师播放器:浏览器中直接原生…...
