在 Java 中操作 MongoDB 的 增刪改查(CRUD) 主要有兩種方式:
- Spring Data MongoDB(推薦,類似 JPA 風格)
- 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 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 < 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
:自定義字段名
根據項目需求選擇合適的方式即可! 🚀