在 Java 中操作 MongoDB 的 增删改查(CRUD) 主要有两种方式:
- Spring Data MongoDB(推荐,类似 JPA 风格)
- MongoDB Java Driver(原生 API,更灵活)
1. Spring Data MongoDB 方式
环境准备
依赖(Maven):
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
实体类 (User
):
java
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) 插入数据
java
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) 查询数据
java
// 查询所有
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) 更新数据
java
// 更新匹配的第一条
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) 删除数据
java
// 按 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):
xml
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.11.1</version>
</dependency>
连接数据库:
java
MongoClient client = MongoClients.create("mongodb://localhost:27017");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("users");
CRUD 操作
(1) 插入数据
java
// 插入单个
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) 查询数据
java
// 查询所有
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) 更新数据
java
// 更新单条
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) 删除数据
java
// 删除单条
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) 复杂条件查询
java
// 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) 聚合查询
java
// 按 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
:自定义字段名
根据项目需求选择合适的方式即可! 🚀