MongoDB的操作

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

  1. Spring Data MongoDB(推荐,类似 JPA 风格)
  2. 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:自定义字段名

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

相关推荐
火凤凰--凤凰码路1 小时前
MySQL 中的“双路排序”与“单路排序”:原理、判别与实战调优
android·数据库·mysql
m0_564264182 小时前
开源数据库E-R图绘制工具分享
数据库·经验分享·mysql·e-r图·开源工具
····懂···3 小时前
关于PGCE专家技术认证解决方案
数据库·postgresql
秋千码途3 小时前
小架构step系列22:加载系统配置
数据库·架构
zone_z3 小时前
告别静态文档!Oracle交互式技术架构图让数据库学习“活“起来
数据库·学习·oracle
旧时光巷3 小时前
SQL基础⑭ | 变量、流程控制与游标篇
数据库·sql·学习·mysql·变量·游标·流程控制
PythonicCC3 小时前
Django模板系统
数据库·django
小云数据库服务专线3 小时前
GaussDB view视图的用法
数据库
DBLens数据库管理和开发工具4 小时前
MySQL新增字段DDL:锁表全解析、避坑指南与实战案例
数据库·后端
xiaobin889995 小时前
PowerDesigner安装教程(附加安装包)PowerDesigner详细安装教程PowerDesigner 16.6 最新版安装教程
数据库·其他