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

MongoDB的操作

在 Java 中操作 MongoDB 的 增删改查(CRUD) 主要有两种方式:

  1. Spring Data MongoDB(推荐,类似 JPA 风格)
  2. MongoDB Java Driver(原生 API,更灵活)

1. Spring Data MongoDB 方式

环境准备

依赖(Maven):

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

实体类User):

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;@Document(collection = "users") // 指定集合名
public class User {@Idprivate String id;  // MongoDB 默认使用 _idprivate String name;private Integer age;// getter/setter 省略
}

CRUD 操作

(1) 插入数据
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;@Autowired
private MongoTemplate mongoTemplate;// 插入单个
User user = new User("Alice", 25);
mongoTemplate.insert(user);// 批量插入
List<User> users = Arrays.asList(new User("Bob", 30),new User("Charlie", 22)
);
mongoTemplate.insertAll(users);
(2) 查询数据
// 查询所有
List<User> allUsers = mongoTemplate.findAll(User.class);// 按 ID 查询
User user = mongoTemplate.findById("65a1b2c3d4e5f", User.class);// 条件查询(name = "Alice")
Query query = Query.query(Criteria.where("name").is("Alice"));
List<User> users = mongoTemplate.find(query, User.class);// 分页查询
Query pageQuery = Query.query(Criteria.where("age").gt(20)).skip(10)  // 跳过前 10 条.limit(5); // 每页 5 条
List<User> pagedUsers = mongoTemplate.find(pageQuery, User.class);
(3) 更新数据
// 更新匹配的第一条
Query query = Query.query(Criteria.where("name").is("Alice"));
Update update = new Update().set("age", 26);
mongoTemplate.updateFirst(query, update, User.class);// 更新所有匹配的
mongoTemplate.updateMulti(query, update, User.class);// 如果不存在则插入(upsert)
mongoTemplate.upsert(query, update, User.class);
(4) 删除数据
// 按 ID 删除
mongoTemplate.remove(user); // 需先查询出对象// 条件删除
Query query = Query.query(Criteria.where("age").lt(20));
mongoTemplate.remove(query, User.class);// 删除整个集合
mongoTemplate.dropCollection(User.class);

2. MongoDB Java Driver 方式(原生 API)

环境准备

依赖(Maven):

<dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>4.11.1</version>
</dependency>

连接数据库

MongoClient client = MongoClients.create("mongodb://localhost:27017");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("users");

CRUD 操作

(1) 插入数据
// 插入单个
Document user = new Document("name", "Alice").append("age", 25);
collection.insertOne(user);// 批量插入
List<Document> users = Arrays.asList(new Document("name", "Bob").append("age", 30),new Document("name", "Charlie").append("age", 22)
);
collection.insertMany(users);
(2) 查询数据
// 查询所有
FindIterable<Document> allUsers = collection.find();// 条件查询(age > 20)
Bson filter = Filters.gt("age", 20);
FindIterable<Document> result = collection.find(filter);// 排序和分页
Bson sort = Sorts.descending("age");
FindIterable<Document> sortedUsers = collection.find().sort(sort).skip(10).limit(5);
(3) 更新数据
// 更新单条
Bson query = Filters.eq("name", "Alice");
Bson update = Updates.set("age", 26);
collection.updateOne(query, update);// 更新多条
collection.updateMany(query, update);// Upsert(不存在则插入)
UpdateOptions options = new UpdateOptions().upsert(true);
collection.updateOne(query, update, options);
(4) 删除数据
// 删除单条
Bson query = Filters.eq("name", "Alice");
collection.deleteOne(query);// 删除多条(age < 20)
Bson condition = Filters.lt("age", 20);
collection.deleteMany(condition);

3. 两种方式对比

功能Spring Data MongoDBMongoDB Java Driver
易用性✅ 类似 JPA,注解驱动❌ 需手动处理 Document
灵活性❌ 复杂查询需写 Query 对象✅ 直接使用原生语法
适用场景快速开发、简单 CRUD高性能、复杂聚合操作
事务支持✅ 支持声明式事务 @Transactional✅ 需手动管理 ClientSession

4. 常用查询示例

(1) 复杂条件查询

// AND 条件(age > 20 AND name = "Alice")
Criteria criteria = Criteria.where("age").gt(20).and("name").is("Alice");
Query query = Query.query(criteria);
List<User> users = mongoTemplate.find(query, User.class);// OR 条件(age < 20 OR age > 30)
Criteria orCriteria = new Criteria().orOperator(Criteria.where("age").lt(20),Criteria.where("age").gt(30)
);

(2) 聚合查询

// 按 age 分组统计
Aggregation aggregation = Aggregation.newAggregation(Aggregation.group("age").count().as("count")
);
AggregationResults<Document> result = mongoTemplate.aggregate(aggregation, "users", Document.class
);

总结

  • Spring Data MongoDB:适合大多数业务场景,开发效率高。
  • Java Driver:适合高性能、复杂查询或非 Spring 项目。
  • 关键注解
    • @Document:标记集合
    • @Id:主键字段
    • @Field:自定义字段名

根据项目需求选择合适的方式即可! 🚀

http://www.dtcms.com/a/295751.html

相关文章:

  • skywalking应用性能监控
  • 内网穿透的应用-分布式系统观测革命:SigNoz与cpolar的技术协同之道
  • Java从入门到精通!第十三天(IO 流)
  • Web前端:JavaScript every()迭代方法
  • 闲庭信步使用图像验证平台加速FPGA的开发:第三十四课——车牌识别的FPGA实现(6)叠加车牌识别的信息
  • 认识单片机
  • Centos新增磁盘,进行根目录扩容
  • SkyWalking异步采集spring gateway日志
  • 基于Qt和OpenCV的图片与视频编辑器
  • 完整指南:使用Apache htpasswd为Chronograf配置基础认证及功能详解
  • 响应式前端设计:CSS 自适应布局与字体大小的最佳实践
  • spring boot h2数据库无法链接问题
  • 数学基础弱能学好大数据技术吗?
  • JimuReport 积木报表 v2.1.1 版本发布,免费开源的报表和大屏
  • 基于定制开发开源AI智能名片S2B2C商城小程序源码的立减/立得类活动创新设计与应用研究
  • 2025年计算机网络与教育科学国际会议(ICCNES 2025)
  • Spring MVC中常用注解_笔记
  • Kafka入门指南:从零开始掌握分布式消息队列
  • uniapp vue3版本中使用pinia 以及持久化处理
  • 【自用】NLP算法面经(6)
  • TCP重传率优化在云服务器网络协议栈的调优实践
  • MySQL高可用部署
  • 深度分析Android多线程编程
  • aml1-eto 移植后多长时间转阴
  • Android跨进程通信完全教程:从基础到实战
  • 从0开始学习R语言-Day56--空间变系数模型
  • 进阶向:基于Python的轻量级Markdown笔记管理器
  • git鉴权失败问题每次clone 都要输入用户名密码问题
  • Two Knights(数学归纳)
  • 本地部署Jupyter服务,没有公网IP如何用内网穿透工具实现外网远程访问?