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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93186.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93186.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93186.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

getConnectionOwnerUid

在Android系统中&#xff0c;为了进行网络权限控制、流量统计等&#xff0c;需要将网络连接&#xff08;如Socket&#xff09;与发起该连接的应用UID关联起来。这种关联通常在内核中建立&#xff0c;并在用户空间通过一些接口进行查询。 1. 内核中的实现基础 Linux内核中&#…

开源 Arkts 鸿蒙应用 开发(十)通讯--Http数据传输

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

net8.0一键创建支持(RabbitMQ)

Necore项目生成器 - 在线创建Necore模板项目 | 一键下载 RabbitMQController.cs using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System.Text; using System.Threading.Tasks; using UnT.Tem…

Rust 泛型与特性

Rust 泛型与特性 引言 Rust 语言以其安全性和高效性在编程语言中独树一帜。Rust 的泛型和特性是其核心特性之一,它们使得开发者能够编写更加通用、灵活且安全的代码。本文将深入探讨 Rust 中的泛型和特性,包括其概念、用法以及在实际开发中的应用。 泛型简介 概念 泛型是…

LangChain学习——结构化输出和数据解析

LangChain 本指南全面介绍LangChain中结构化输出生成和数据解析的核心功能&#xff0c;包括Pydantic BaseModel构造、各种输出解析器的使用&#xff0c;以及高级错误处理机制。 详细测试样例和代码可参考如下两个链接&#xff1a; test_output_parserstest_pydantic_base_mo…

基于华为ENSP的BGP的状态机深入浅出

本篇技术博文摘要 &#x1f31f; 本文章主要探讨BGP状态机如何控制BGP连接的建立与维护&#xff0c;以及BGP协议在运行过程中如何交换路由信息并确保网络的稳定性 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我是肾透侧视攻城狮&…

Android 15中的16KB大页有何优势?

deepseek回答&#xff1a; Android 15引入的16KB大内存页是系统性能优化的关键变革&#xff0c;其核心优势体现在以下方面&#xff1a; ⚡ 一、性能全面提升 系统整体加速 配置16KB页面的设备整体性能提升5%-10%&#xff0c;通过减少内存管理开销释放更多资源用于应用运行。…

Gis数据的A*算法规划航线

1.1 用到的技术栈geotools JTSJgrapht1.2 实现思路// 定义栅格网格参数private static final double CELL_SIZE_DEGREES 0.005;private static int gridWidth 0;//格子高度 index 1private static int gridHeight 0;//格子宽度// 1. 读取GeoJSON文件File geoJsonFile new …

Spring Boot 默认使用 CGLIB,但CGLIB 无法代理 final 类或 final 方法

那么当这两件事冲突时&#xff0c;Spring Boot 是怎么“解决”的呢&#xff1f;答案是&#xff1a;它不解决&#xff0c;也无法解决。当这种情况发生时&#xff0c;你的应用程序会直接启动失败。这不是 Spring Boot 的疏忽&#xff0c;而是由 CGLIB 的底层原理和 Java 语言的规…

cuda编程笔记(10)--memory access 优化

全局内存访问优化&#xff08;Coalesced Access&#xff09; 什么是 Coalesced Access&#xff1f; 定义&#xff1a;一个 warp&#xff08;32 个线程&#xff09;在同一指令中访问全局内存时&#xff0c;如果这些访问请求可以合并成尽可能少的内存事务&#xff08;通常是 32…

闲庭信步使用图像验证平台加速FPGA的开发:第三十一课——车牌识别的FPGA实现(3)车牌字符分割预处理

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击top_tb.bat文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程…

电子电气架构 --- 汽车软件全生命周期

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

力扣面试150(41/150)

7.25 56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 我的思路&#xff1a; 左端点升序…

【隧道篇 / IPsec】(7.6) ❀ 01. 利用向导快速建立IPsec安全隧道 (点对点) ❀ FortiGate 防火墙

【简介】相信很多人已经习惯利用导向快速创建VPN了&#xff0c;而且已经有部分尝鲜者已经用上了FortiOS 7.6&#xff0c;但是会发现FortiOS 7.6下的VPN向导改变了很多&#xff0c;一时无法下手&#xff0c;下面我们来看看最常见的点对点是如何配置的。环境介绍在配置IPsec VPN之…

PLLIP核

。1 号红色框内的速度等级代表着设备的速度 等级&#xff0c;保存默认就好&#xff1b;2 号红色框内设置输入频率&#xff1b;3 号红色框选择 PLL 的工作模式。我们 开发板用的晶振是 50MHz 的&#xff0c;故在 2 号红色框内我们填写 50MHz&#xff1b;我们在 3 号红色框内选正…

1.1 Deep learning?pytorch ?深度学习训练出来的模型通常有效但无法解释合理性? 如何 解释?

DL 是什么&#xff0c;你如何理解DL模型&#xff1f; DL 对于我而言&#xff0c;就是人类试图想通过数学语言描述人类学习过程的一门技术&#xff0c;或者说学科。 因此 DL 模型 相当于 数学 的 一个 funciton &#xff0c;有输入&#xff0c;通过function处理&#xff0c;得…

java实现在工具类中注入其他对象方式

方案1&#xff1a; Slf4j Component public class ChatdocApiClient {Value("${chatdoc.app-id}")private String appId;Value("${chatdoc.secret}")private String secret;Value("${chatdoc.domain}")private String domain;private final Rest…

electron中IPC 渲染进程与主进程通信方法解析

electron中ipcRenderer.invoke、ipcRenderer.on、ipcRenderer.send、ipcRenderer.sendSync作用与区别 IPC 渲染进程与主进程通信方法解析 ipcRenderer 的这几个方法作用不完全相同&#xff0c;它们适用于不同的通信场景&#xff0c;核心区别在于通信方向、是否需要响应以及同步…

epoll_event 事件类型详解

epoll_event 事件类型详解 epoll_event 是 Linux epoll I/O 多路复用机制的核心结构体&#xff0c;其中的事件类型决定了 epoll 监控的行为和触发条件。以下是各种事件类型的详细解析&#xff1a; epoll_event 结构体 #include <sys/epoll.h>typedef union epoll_data {v…

设计自己的小传输协议 导论与概念

设计自己的小传输协议 导论与概念 1&#xff1a;聊一聊协议头设计 ​ 早在《TCP/IP详解》中的第一句话中&#xff0c;我们就知道协议的含义是这样的&#xff1a;协议是通信双方共同遵守的一套规则&#xff0c;提供格式定义、语义解释等&#xff0c;使不同设备或软件能够正确交…