1. 写在前面的话

嗨,各位Java开发小伙伴!今天咱们来聊聊怎么用Java和MongoDB这对黄金搭档搞事情。MongoDB这个非关系型数据库的灵活特性,配上Java的强类型优势,特别适合需要快速迭代的应用场景。接下来的内容像给朋友唠嗑一样,带大家手把手搞定集合操作和CRUD全流程。


2. 环境准备速览

技术栈:

  • MongoDB Server 5.0+
  • MongoDB Java Driver 3.12+
  • JDK 11+

Maven配置:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>3.12.11</version>
</dependency>

初始化连接:

// 创建MongoClient示例
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");

// 选择目标数据库(不存在自动创建)
MongoDatabase database = mongoClient.getDatabase("shopDB");

3. 集合创建

3.1 自动创建魔法

// 选择集合时会自动创建(首次插入数据时)
MongoCollection<Document> users = database.getCollection("users");

3.2 显式创建集合

try {
    // 设置集合选项
    CreateCollectionOptions options = new CreateCollectionOptions()
        .capped(true)
        .sizeInBytes(1024 * 1024); // 固定集合大小

    // 创建集合并设置参数
    database.createCollection("order_logs", options);
} catch (MongoException e) {
    System.err.println("集合创建失败:" + e.getMessage());
}

4. 文档CRUD完整操作指南

4.1 插入操作

单条插入示例:

// 构建用户文档
Document userDoc = new Document()
    .append("username", "码农小张")
    .append("age", 28)
    .append("tags", Arrays.asList("Java", "MongoDB"))
    .append("registerDate", new Date());

// 插入操作
users.insertOne(userDoc);
System.out.println("插入成功,文档ID:" + userDoc.get("_id"));

批量插入示例:

List<Document> productList = new ArrayList<>();
productList.add(new Document("name", "无线鼠标").append("price", 99));
productList.add(new Document("name", "机械键盘").append("price", 299));

database.getCollection("products")
    .insertMany(productList);

4.2 查询操作

基础查询:

// 查找年龄大于25的用户
Bson filter = Filters.gt("age", 25);
FindIterable<Document> results = users.find(filter);

// 遍历结果集
for (Document doc : results) {
    System.out.println("查询到用户:" + doc.toJson());
}

聚合查询实战:

List<Bson> pipeline = Arrays.asList(
    Aggregates.match(Filters.gt("price", 100)), // 过滤高价商品
    Aggregates.group("$category", Accumulators.sum("total", "$price"))
);

database.getCollection("products")
    .aggregate(pipeline)
    .forEach(doc -> System.out.println("分类总价:" + doc.toJson()));

4.3 更新操作

更新现有字段:

// 创建过滤器
Bson updateFilter = Filters.eq("username", "码农小张");

// 构建更新操作
Bson updateOperation = Updates.combine(
    Updates.set("level", "VIP"),
    Updates.inc("age", 1)
);

UpdateResult result = users.updateOne(updateFilter, updateOperation);
System.out.println("修改了" + result.getModifiedCount() + "条记录");

数组操作示例:

// 往tags数组追加元素
Bson arrayUpdate = Updates.addToSet("tags", "Python");
users.updateMany(Filters.empty(), arrayUpdate);

4.4 删除操作的注意事项

条件删除:

// 删除库存为0的商品
Bson deleteCondition = Filters.eq("stock", 0);
DeleteResult delResult = database.getCollection("products")
    .deleteMany(deleteCondition);

System.out.println("成功删除" + delResult.getDeletedCount() + "条滞销商品");

5. 事务处理实战

try (ClientSession session = mongoClient.startSession()) {
    session.startTransaction();

    try {
        // 转账操作
        database.getCollection("accounts")
            .updateOne(session, Filters.eq("name", "账户A"), Updates.inc("balance", -100));
        
        database.getCollection("accounts")
            .updateOne(session, Filters.eq("name", "账户B"), Updates.inc("balance", 100));
        
        session.commitTransaction();
    } catch (Exception e) {
        session.abortTransaction();
        System.err.println("交易失败:" + e.getMessage());
    }
}

6. 典型应用场景

  1. 电商平台:用户行为数据存储(点击流、搜索历史)
  2. 物联网系统:设备状态时序数据存储
  3. 内容管理:博客文章的多版本存储
  4. 实时分析:用户画像的快速聚合查询

7. 技术优缺点大盘点

7.1 优势亮点

  • 灵活模式:动态调整数据结构
  • 扩展性强:分片集群轻松应对海量数据
  • 高性能写入:适合日志类高频写入场景
  • 丰富查询:支持复杂聚合与地理空间查询

7.2 潜在挑战

  • 事务性能:多文档事务存在性能损耗
  • 内存消耗:全内存查询对硬件要求高
  • 学习曲线:需要掌握BSON语法体系

8. 避坑指南手册

  1. 索引优化:确保高频查询字段创建索引
  2. 数据建模:避免过度嵌套(推荐3层以内)
  3. 连接池:合理配置maxPoolSize(建议50-100)
  4. 写关注:根据业务选择合适的安全级别
  5. 版本兼容:注意驱动版本与服务端版本对应关系

9. 全文总结回顾

本文通过代码示例,系统讲解了如何在Java生态中玩转MongoDB的核心操作。从基础的集合创建到复杂的聚合查询,再到企业级事务处理,我们既掌握了基础操作要领,也了解了生产环境中的避坑技巧。记住:好的技术选型=合适的场景+正确的使用方式,MongoDB在灵活数据存储领域依然具有不可替代的优势。