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

MongoPlus 教程

一、MongoPlus 简介

MongoPlus是一个基于 MyBatis-Plus 思想设计的 MongoDB ORM 框架,提供了类似 MyBatis-Plus 的便捷操作体验。

⚠️注意:MyBatis-Plus 本身是针对关系型数据库(MySQL、PostgreSQL等)的增强工具,并不支持 MongoDB。操作 MongoDB 需要使用专门的框架,如:

  • MongoPlus(国产,仿 MyBatis-Plus 风格)

  • Spring Data MongoDB(官方推荐)

  • Morphia

二、MongoPlus 快速上手

1. 添加依赖

<dependency> <groupId>com.gitee.anwena</groupId> <artifactId>mongo-plus-boot-starter</artifactId> <version>1.0.4</version> </dependency>

2. 配置 application.yml

spring: data: mongodb: uri: mongodb://localhost:27017/testdb # 或使用以下配置 host: localhost port: 27017 database: testdb username: admin password: 123456

3. 实体类定义

import com.gitee.anwena.mongo.plus.annotation.*; @Data @CollectionName("users") // 指定集合名 public class User { @MongoId(IdTypeEnum.ASSIGN_ID) // 自动生成ID private String id; @MongoIndex // 普通索引 @MongoField("user_name") // 字段映射 private String username; @MongoIndex(type = IndexTypeEnum.DESC) // 降序索引 private Integer age; @MongoField private String email; @MongoField private LocalDateTime createTime; }

4. Mapper 接口

import com.gitee.anwena.mongo.plus.core.MongoMapper; @Repository public interface UserMapper extends MongoMapper<User> { // 继承 MongoMapper 即可获得基础CRUD方法 }

5. Service 层使用

@Service public class UserService { @Autowired private UserMapper userMapper; // 插入 public void insertUser() { User user = new User(); user.setUsername("张三"); user.setAge(25); user.setEmail("zhangsan@example.com"); user.setCreateTime(LocalDateTime.now()); userMapper.insert(user); System.out.println("插入ID: " + user.getId()); } // 查询所有 public List<User> getAllUsers() { return userMapper.selectList(new QueryWrapper<>()); } // 条件查询 public List<User> getUsersByAge(Integer age) { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("age", age); return userMapper.selectList(wrapper); } // 分页查询 public Page<User> getUsersByPage(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); return userMapper.selectPage(page, new QueryWrapper<>()); } // 更新 public void updateUser(String id, Integer newAge) { UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("_id", id); wrapper.set("age", newAge); userMapper.update(null, wrapper); } // 删除 public void deleteUser(String id) { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("_id", id); userMapper.delete(wrapper); } }

三、Spring Data MongoDB 官方方案(更推荐)

由于 MongoPlus 文档较少,实际生产中更常用Spring Data MongoDB

1. 依赖配置

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

2. 实体类

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; @Data @Document(collection = "users") // 指定集合 public class User { @Id private String id; @Indexed(unique = true) // 唯一索引 @Field("user_name") private String username; private Integer age; private String email; private Date createTime; }

3. Repository 接口

import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; public interface UserRepository extends MongoRepository<User, String> { // 根据年龄查询 List<User> findByAge(Integer age); // 年龄大于指定值 List<User> findByAgeGreaterThan(Integer age); // 模糊查询 List<User> findByUsernameLike(String username); // 复杂查询(使用JSON) @Query("{ 'age' : { $gt: ?0 }, 'username' : { $regex: ?1 } }") List<User> findUsersByCondition(Integer minAge, String usernamePattern); }

4. Service 使用

@Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private MongoTemplate mongoTemplate; // 更灵活的查询 // 基础CRUD public User save(User user) { user.setCreateTime(new Date()); return userRepository.save(user); } public List<User> findAll() { return userRepository.findAll(); } public Optional<User> findById(String id) { return userRepository.findById(id); } public void deleteById(String id) { userRepository.deleteById(id); } // 使用 MongoTemplate 进行复杂操作 public List<User> findByAgeRange(Integer minAge, Integer maxAge) { Query query = new Query(Criteria.where("age").gte(minAge).lte(maxAge)); return mongoTemplate.find(query, User.class); } // 聚合查询 public List<UserStats> getUserStats() { Aggregation aggregation = Aggregation.newAggregation( Aggregation.group("age").count().as("count"), Aggregation.sort(Sort.Direction.DESC, "count") ); return mongoTemplate.aggregate(aggregation, "users", UserStats.class) .getMappedResults(); } }

5. 常用查询条件

// 等值查询 Criteria.where("age").is(25) // 范围查询 Criteria.where("age").gte(18).lte(30) // 模糊查询 Criteria.where("username").regex("张.*") // IN 查询 Criteria.where("age").in(Arrays.asList(20, 25, 30)) // 逻辑组合 Criteria.where("age").gt(18).and("username").exists(true) // OR 条件 Criteria.orOperator( Criteria.where("age").lt(18), Criteria.where("age").gt(60) )

四、两者对比

特性MongoPlusSpring Data MongoDB
风格类 MyBatis-PlusSpring 官方风格
文档较少完善
社区活跃度较低非常高
学习成本低(MP用户友好)中等
生产环境验证较少广泛使用
功能完整性基础功能全面(包括聚合、GridFS等)

五、推荐方案

  1. 个人项目/快速原型:可以使用 MongoPlus

  2. 企业级生产项目:强烈推荐使用Spring Data MongoDB

  3. 高性能复杂查询:直接使用 MongoDB Driver + 自定义封装

六、完整示例项目结构

src/ ├── main/ │ ├── java/ │ │ └── com/example/mongodemo/ │ │ ├── entity/User.java │ │ ├── repository/UserRepository.java │ │ ├── service/UserService.java │ │ ├── controller/UserController.java │ │ └── MongodemoApplication.java │ └── resources/ │ └── application.yml
http://www.jsqmd.com/news/668868/

相关文章:

  • 2026奇点智能技术大会核心洞察(AGI-VR协同架构白皮书首发)
  • 【2026奇点智能技术大会权威内参】:AGI人才争夺战已打响,HR必须掌握的5大精准匹配模型与实时评估框架
  • 如何同步SQL冗余字段信息_通过触发器实现自动反向填充
  • 从模糊到通透:CSS filter与backdrop-filter打造沉浸式视觉体验
  • 告别ThreadLocal!Spring WebFlux中如何用Reactor Context优雅传递用户Token?
  • 湖南华商文化商务有限公司官网介绍
  • 还在用简单 AI 对话?Spring AI 自定义工具 + MCP 协议直接打通外部服务!
  • SpringBoot+Vue编程语言学习辅导网站源码+论文
  • ImageMagick进阶玩法:结合Windows批处理,自动备份并生成网站缩略图与社交分享图
  • 打造简易Agent,深度解析LLM与工具的完美协作!
  • 深入AUTOSAR内存管理:拆解vLinkGen如何配置数据段的多阶段初始化(Early/One/HardReset)
  • async,future,packaged_task,promise
  • 从毛玻璃到沉浸式界面:探索CSS filter与backdrop-filter的进阶应用
  • 别再只会用‘w‘和‘r‘了!Matlab fopen函数权限参数全解析(含编码与字节序)
  • 项目实训博客2 刻画能力画像:动态用户与岗位画像建模
  • 怎样设计一块独特的牌匾?
  • 深度空间装饰回头客多
  • Notion 白屏故障排查:从客户端到浏览器的全方位修复指南
  • 手机无限重启怎么办
  • [MYSQL/K8s] 基于 Kubenetes 集群安装 MYSQL
  • 实战指南|3类高频软件漏洞,从识别到修复一步到位
  • 7岁、10岁、14岁开始学C++,收益与必要性有何不同?
  • Spring Boot 条件装配入门:一文搞懂 @ConditionalOnClass(附实战)
  • 2026年泰迪杯A完整题解方案-详细解题思路和论文+完整项目代码+全套资源
  • C语言之Redis源码阅读学习顺序
  • 2026市场岗位学数据分析的价值分析
  • Windows (PowerShell)安装部署OpenClaw
  • 从CTFHub靶场实战出发:手把手教你用Gopher协议打穿SSRF(附BurpSuite配置)
  • 瓶子倒水二分法:最大化最小值
  • 下篇:Python 多任务编程入门(二)—— 进程同步、进程池与注意事项