SpringBoot 整合 MongoDB

张开发
2026/4/20 3:54:33 15 分钟阅读

分享文章

SpringBoot 整合 MongoDB
MySQL 适合结构化数据Redis 适合缓存而MongoDB则是介于两者之间——它是一款文档型 NoSQL 数据库以类似 JSON 的 BSON 格式存储数据结构灵活、无需预定义表结构、支持复杂查询、横向扩展方便非常适合存储非结构化/半结构化数据。一、MongoDB 适用场景• 文章、博客、评论、日志类数据字段多变• 用户画像、行为数据、埋点上报• 配置中心、动态表单、商品详情• 大数据量、高写入、低事务要求的业务• 需要频繁扩展字段不想频繁改表结构二、环境准备• 安装并启动 MongoDB本地或云服务• SpringBoot 2.x / 3.x• MongoDB 客户端工具Navicat、Mongo Compass 等三、引入核心依赖!-- SpringBoot MongoDB 启动器 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-mongodb/artifactId /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency四、application.yml 配置spring: data: mongodb: # 无密码形式 uri: mongodb://localhost:27017/mongo_demo # 有密码账号密码认证库 # uri: mongodb://root:123456localhost:27017/mongo_demo?authSourceadmin•mongo_demo是数据库名不存在会自动创建• 无需手动建库建集合collection插入数据自动生成五、MongoDB 常用注解•Document标记为 MongoDB 文档实体对应集合•Id主键默认生成_id•Field(field_name)指定数据库字段名•Transient不存入数据库•Indexed创建索引提升查询速度•CompoundIndex复合索引六、实体类编写以文章Article为例package com.demo.entity; 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 org.springframework.data.mongodb.core.mapping.Field; import java.time.LocalDateTime; import java.util.List; Data Document(collection article) // 指定集合名称 public class Article { Id private String id; Indexed // 为标题创建索引 private String title; private String content; Field(author_name) private String authorName; private Integer viewCount; private ListString tags; private LocalDateTime createTime; private LocalDateTime updateTime; }七、两种操作方式SpringBoot 提供两种操作 MongoDB 的方式1.MongoRepository简单 CRUD类似 JPA2.MongoTemplate灵活复杂查询、聚合、更新生产更常用方式一MongoRepository 快速 CRUD1. 编写 Repository 接口package com.demo.repository; import com.demo.entity.Article; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; import java.util.List; Repository public interface ArticleRepository extends MongoRepositoryArticle, String { // 按作者名查询 ListArticle findByAuthorName(String authorName); // 按标题模糊查询 ListArticle findByTitleLike(String title); }2. 基础 CRUD 示例Service RequiredArgsConstructor public class ArticleService { private final ArticleRepository repository; // 新增/修改 public Article save(Article article) { article.setCreateTime(LocalDateTime.now()); return repository.save(article); } // 根据ID查询 public Article findById(String id) { return repository.findById(id).orElse(null); } // 查询所有 public ListArticle findAll() { return repository.findAll(); } // 删除 public void deleteById(String id) { repository.deleteById(id); } // 按作者查询 public ListArticle findByAuthor(String authorName) { return repository.findByAuthorName(authorName); } }方式二MongoTemplate 复杂查询企业开发绝大多数场景使用MongoTemplate灵活、强大。1. 通用条件查询Autowired private MongoTemplate mongoTemplate; // 条件构造器 Query query new Query(); // 精确匹配 query.addCriteria(Criteria.where(authorName).is(张三)); // 大于 query.addCriteria(Criteria.where(viewCount).gt(100)); // 模糊查询包含 query.addCriteria(Criteria.where(title).regex(Java)); // 且条件 query.addCriteria(Criteria.where(authorName).is(张三).and(viewCount).gt(100)); // 或条件 query.addCriteria(new Criteria().orOperator( Criteria.where(authorName).is(张三), Criteria.where(viewCount).gt(1000) )); // 查询列表 ListArticle list mongoTemplate.find(query, Article.class);2. 分页查询// 页码从0开始 Pageable pageable PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, createTime)); Query pageQuery new Query().with(pageable); ListArticle pageList mongoTemplate.find(pageQuery, Article.class); // 总条数 long total mongoTemplate.count(pageQuery, Article.class);3. 字段更新// 更新浏览量 1 Query query Query.query(Criteria.where(_id).is(id)); Update update new Update().inc(viewCount, 1); mongoTemplate.updateFirst(query, update, Article.class);4. 批量更新mongoTemplate.updateMulti(query, update, Article.class);5. 聚合查询统计、分组// 按作者分组统计文章数量 Aggregation aggregation Aggregation.newAggregation( Aggregation.group(authorName).count().as(count), Aggregation.sort(Sort.by(Sort.Direction.DESC, count)) ); AggregationResultsMap results mongoTemplate.aggregate(aggregation, article, Map.class); ListMap mapList results.getMappedResults();八、MongoDB 索引为高频查询字段加索引性能提升巨大// 单字段索引 Indexed // 唯一索引 Indexed(unique true) // 复合索引 CompoundIndex(def {authorName:1, createTime:-1})创建后可在 MongoDB 中查看db.article.getIndexes()九、MongoDB vs MySQL 简单对比• MySQL表结构固定、事务强、适合强一致性业务• MongoDB结构灵活、无表结构约束、查询快、适合海量半结构化数据十、注意事项1.无事务默认不保证原子性高并发需加锁或使用事务2. 索引不能乱建过多索引影响写入性能3. 超大文档16MB不适合直接存储可存文件服务地址4. 模糊查询regex不命中索引尽量前缀匹配5. 分页深度翻页性能差建议用游标分页十一、总结SpringBoot 整合 MongoDB 非常简单引依赖 → 配连接 → 写实体 → 用 MongoTemplate / Repository它结构灵活、开发极快特别适合文章、评论、日志、用户行为等场景。掌握 CRUD、条件查询、分页、更新、索引基本能覆盖 90% 的业务开发。你在项目中用过 MongoDB 吗一般用来存什么业务数据有没有遇到什么坑欢迎在评论区留言交流关注我持续更新 SpringBoot 全栈实战教程。

更多文章