> 技术文档 > MongoDB的操作

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 { @Id private String id; // MongoDB 默认使用 _id private String name; private Integer age; // getter/setter 省略}

CRUD 操作

(1) 插入数据
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.mongodb.core.MongoTemplate;@Autowiredprivate 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 MongoDB MongoDB 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  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:自定义字段名

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