Spring Boot操作MongoDB的完整示例大全

以下是基于Spring Boot操作MongoDB的完整示例大全,涵盖增删改查、聚合查询、索引、事务等核心功能:


一、基础CRUD操作

1. 环境配置

依赖配置(pom.xml)

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

核心配置(application.yml)

spring:data:mongodb:uri: mongodb://root:123456@192.168.3.11:27017/mydb?authSource=admin# 或分开配置host: 192.168.3.11port: 27017username: rootpassword: 123456authentication-database: admin

2. 实体类定义

@Data
@Document(collection = "users") // 指定集合名
public class User {@Idprivate String id;@Indexed(direction = IndexDirection.ASCENDING) // 单字段索引private String name;@TextIndexed // 全文索引private String email;private Integer age;private Date createDate;
}

3. Repository接口

public interface UserRepository extends MongoRepository<User, String> {// 方法名推导查询List<User> findByName(String name);// 自定义JSON查询@Query("{ 'age' : { $gt: ?0 } }")List<User> findByAgeGreaterThan(int age);
}

4. MongoTemplate操作

@Autowired
private MongoTemplate mongoTemplate;// 插入文档
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setName("Alice");
mongoTemplate.insert(user); // 插入单个文档// 查询所有
List<User> users = mongoTemplate.findAll(User.class);// 根据ID查询
User user = mongoTemplate.findById("1001", User.class);// 条件查询
Query query = new Query();
query.eq("name", "Alice").gt("age", 20);
List<User> result = mongoTemplate.find(query, User.class);// 更新文档
Update update = new Update();
update.set("name", "NewName").inc("age", 1);
mongoTemplate.updateFirst(Query.query(Criteria.where("id").is("1001")), update, User.class);// 删除文档
mongoTemplate.remove(Query.query(Criteria.where("id").is("1001")), User.class);

二、聚合查询操作

1. 使用Aggregation API

// 聚合管道:匹配+分组统计
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(Criteria.where("age").gt(18)), // 过滤年龄>18Aggregation.group("department") // 按部门分组.count().as("total") // 统计人数.avg("salary").as("avgSalary"), // 计算平均工资Aggregation.sort(Sort.Direction.DESC, "total") // 按总人数降序排序
);// 执行聚合
AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, "users", Document.class);

2. 原生JSON聚合

// 直接使用JSON格式定义聚合管道
String pipeline = "[{ $match: { age: { $gt: 18 } } }, " +"{ $group: { _id: '$department', total: { $sum: 1 }, avgSalary: { $avg: '$salary' } } }, " +"{ $sort: { total: -1 } }]";AggregationResults<Document> results = mongoTemplate.aggregate(new BasicQuery(pipeline), "users", Document.class);

三、高级功能实现

1. 全文搜索

// 1. 创建文本索引
@TextIndexed
private String title;// 2. 使用TextCriteria查询
public List<Note> searchNotes(String keyword) {TextCriteria criteria = TextCriteria.forDefaultLanguage().matching(keyword);Query query = new Query(criteria);return mongoTemplate.find(query, Note.class);
}

2. 事务管理

@Configuration
@EnableTransactionManagement
public class MongoConfig {@Beanpublic MongoTransactionManager transactionManager(MongoDatabaseFactory factory) {return new MongoTransactionManager(factory);}
}// 服务层使用@Transactional
@Service
public class TransferService {@Transactionalpublic void transferMoney(String fromId, String toId, double amount) {// 扣减转出账户mongoTemplate.updateFirst(Query.query(Criteria.where("id").is(fromId)), new Update().inc("balance", -amount), Account.class);// 增加转入账户mongoTemplate.updateFirst(Query.query(Criteria.where("id").is(toId)), new Update().inc("balance", amount), Account.class);}
}

3. 连接池调优

spring:data:mongodb:uri: mongodb://user:pass@host:27017/db?maxIdleTimeMS=300000&maxPoolSize=100&minPoolSize=10&maxWaitTimeMS=1000

四、性能优化技巧

1. 分页查询

// 使用Pageable实现分页
Pageable pageable = PageRequest.of(0, 10, Sort.by("age").descending());
Query query = new Query().with(pageable);
List<User> users = mongoTemplate.find(query, User.class);

2. 复合索引

@CompoundIndexes({@CompoundIndex(name = "name_age_index", def = "{'name': 1, 'age': -1}")
})
public class User {}

3. 地理位置查询

// 创建2D索引
@Field(store = true, indexDirection = Direction.GEO2D)
private Point location;// 查询附近5公里内的用户
Query query = new Query();
query.near("location", new GeoJsonPoint(116.4, 39.9)).maxDistance(5000);
List<User> nearbyUsers = mongoTemplate.find(query, User.class);

五、常见异常处理

  1. 连接超时:检查URI配置和网络连通性,适当增加connectTimeoutMS
  2. 查询无结果:确认数据存在且索引生效,可使用hint()强制指定索引
  3. 事务冲突:确保操作集合已存在并启用副本集
  4. 内存溢出:聚合查询时添加allowDiskUse(true)

完整代码示例可参考CSDN专题教程,生产环境建议结合分库分表、读写分离等高级架构设计。

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

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

相关文章

【实战教程】零基础搭建DeepSeek大模型聊天系统 - Spring Boot+React完整开发指南

&#x1f525; 本文详细讲解如何从零搭建一个完整的DeepSeek AI对话系统&#xff0c;包括Spring Boot后端和React前端&#xff0c;适合AI开发入门者快速上手。即使你是编程萌新&#xff0c;也能轻松搭建自己的AI助手&#xff01; &#x1f4da;博主匠心之作&#xff0c;强推专栏…

Linux系统基本指令和知识指南

一、Linux系统简介 Linux是一种自由和开放源代码的类UNIX操作系统&#xff0c;由林纳斯托瓦兹在1991年首次发布。它以稳定性、安全性和灵活性著称&#xff0c;广泛应用于服务器、嵌入式系统和个人计算机。 Linux主要特点&#xff1a; 开源免费 多用户、多任务 良好的安全性…

【计算机视觉】OpenCV实战项目:Long-Exposure:基于深度学习的长时间曝光合成技术

Long-Exposure&#xff1a;基于深度学习的长时间曝光合成技术 项目概述与技术背景项目核心功能技术原理 环境配置与安装硬件要求建议详细安装步骤可选组件安装 实战应用指南1. 基础使用&#xff1a;视频转长曝光2. 高级模式&#xff1a;自定义光轨合成3. 批量处理模式 技术实现…

TikTok 矩阵账号运营实操细节:打造爆款矩阵

在 TikTok 的流量版图里&#xff0c;打造 TikTok 矩阵账号能显著提升影响力与吸粉能力。而借助 AI 工具&#xff0c;更可为 TikTok 矩阵运营效率的提升赋能&#xff0c;让运营如虎添翼。下面就为大家详细讲讲其中的实操细节&#xff0c;并结合一些伪代码示例辅助理解。 一、矩…

互联网大厂Java求职面试:分布式系统中向量数据库与AI应用的融合探索

互联网大厂Java求职面试&#xff1a;分布式系统中向量数据库与AI应用的融合探索 面试开场&#xff1a;技术总监与郑薪苦的“较量” 技术总监&#xff08;以下简称T&#xff09;&#xff1a;郑薪苦先生&#xff0c;请简单介绍一下你在分布式系统设计方面的经验。 郑薪苦&…

【每日八股】学习 RocketMQ Day2:进阶(一)

文章目录 复习昨日内容为什么要使用消息队列为什么选择 RocketMQRocketMQ 的优缺点&#xff1f;谈谈你对 RocketMQ 的理解&#xff1f;消息队列有哪些类型&#xff1f;RocketMQ 采用哪种消息队列模型&#xff1f;消息的消费模式了解吗&#xff1f;了解 RocketMQ 的基本架构吗&a…

探索智能体开发新边界:Cangjie Magic开源平台体验与解析

文章目录 每日一句正能量前言一、Cangjie Magic的核心技术&#xff08;一&#xff09;Agent DSL架构&#xff08;二&#xff09;原生支持MCP通信协议&#xff08;三&#xff09;智能规划功能 二、实际应用场景&#xff08;一&#xff09;智能客服系统&#xff08;二&#xff09…

深入解析进程间通信与Socket原理:从理论到TypeScript实战

文章目录 一、进程中如何通信1.1 管道1.1.1 核心特性1.1.2 缺点1.1.3 匿名管道与命名管道的对比 1.2 信号1.2.1 核心特性1.2.2 缺点1.2.3 信号分类对比 1.3 消息队列1.3.1 核心特性1.3.2 缺点 1.4 共享内存1.4.1 核心特性1.4.2 缺点 1.5 信号量1.5.1 核心特性1.5.2 缺点 二、So…

力扣-hot100(旋转图像)

48. 旋转图像 中等 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4…

Docker编排工具---Compose的概述及使用

目录 一、Compose工具的概述 二、Compose的常用命令 1、列出容器 2、查看访问日志 3、输出绑定的公共端口 4、重新构建服务 5、启动服务 6、停止服务 7、删除已停止服务的容器 8、创建和启动容器 9、在运行的容器中执行命令 10、指定一个服务启动容器的个数 11、其…

C25-数组应用及练习

第一题 题目: 代码 #include <stdio.h> int main() {//数组及相关数据定义int arr[10];int i;//基于循环的数组数据输入for(i0;i<10;i){arr[i]i;}//基于循环的数组数据输出for(i9;i>0;i--){printf("%d ",arr[i]);}return 0; }结果 第二题 题目 代码 …

网络安全怎么入门?快速了解

网络安全是一个快速发展的领域&#xff0c;入门需要系统化的学习和实践。以下是适合零基础或转行者的分阶段学习路径&#xff0c;涵盖必备知识、学习资源、实战方法和职业方向&#xff1a; 一、基础阶段&#xff08;1-3个月&#xff09; 1. 掌握核心基础知识 计算机网络&#…

express 怎么搭建 WebSocket 服务器

一&#xff1a;使用 express-ws var express require(express); var app express(); var expressWs require(express-ws)(app);app.use(function (req, res, next) {console.log(middleware);req.testing testing;return next(); });app.get(/, function(req, res, next){…

【AI论文】SuperEdit:修正并促进基于指令的图像编辑的监督信号

摘要&#xff1a;由于手动收集准确的编辑数据存在挑战&#xff0c;现有的数据集通常使用各种自动化方法构建&#xff0c;导致编辑指令和原始编辑图像对之间不匹配导致监督信号出现噪声。 最近的研究试图通过生成更高质量的编辑图像、在识别任务上进行预训练或引入视觉语言模型&…

关于大疆红外图片提取温度方法 python 方法

思路 红外图片需要是黑白图片 提取红外图片最高和最低温度 温度图例 根据最高温度31.2摄氏度 最低温度19.9摄氏度 那中间的值在 0到255 之间 那有这个值之后。就可以获取到图片里面 每个点或者面的值 实现方式 def find_Gray(self, t_max, t_min, c_temp):"""…

金融小知识

&#x1f4c9; 一、“做空”是啥&#xff1f; 通俗说法&#xff1a;押“它会跌”&#xff0c;赚钱&#xff01; ✅ 举个例子&#xff1a; 有一天老王的包子涨价到 10 块一个&#xff0c;张三觉得这价格肯定撑不住&#xff0c;未来会跌到 5 块。于是他&#xff1a; 向朋友借了…

JavaScript 数据存储全攻略:从 Cookie 到 IndexedDB

1. Cookie&#xff1a;传统的轻量级存储 Cookie 是最早的客户端存储解决方案之一&#xff0c;最初设计用于服务器和客户端之间的状态保持。 基本用法 javascript 复制 下载 // 设置cookie document.cookie "usernameJohnDoe; expiresThu, 18 Dec 2025 12:00:00 UTC…

Leetcode 刷题记录 09 —— 链表第三弹

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答&#xff0c;01~07为C语言&#xff0c;08及以后为Java语言。 01 合并 K 个升序链表 /*** Definitio…

如何利用 Elastic Load Balancing 提升应用性能与可用性?

当今云计算的快速发展中&#xff0c;随着应用需求的增加&#xff0c;如何确保系统能够高效、稳定地处理不断增长的流量成为了每个技术团队关注的焦点。Elastic Load Balancing&#xff08;ELB&#xff09;作为一种强大的工具&#xff0c;能够帮助开发者和运维人员轻松应对流量波…

Word如何制作三线表格

1.需求 将像这样的表格整理成论文中需要的三线表格。 2.直观流程 选中表格 --> 表格属性中的边框与底纹B --> 在设置中选择无&#xff08;重置表格&#xff09;–> 确定 --> 选择第一行&#xff08;其实是将第一行看成独立表格了&#xff0c;为了设置中线&…