MongoDB的操作
在 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 { @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. 两种方式对比
Document
Query
对象@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
:自定义字段名
根据项目需求选择合适的方式即可! 🚀