Spring Boot操作MongoDB的完整示例大全

以下是基于Spring Boot操作MongoDB的完整示例大全,涵蓋增刪改查、聚合查詢、索引、事務等核心功能:


一、基礎CRUD操作

1. 環境配置

依賴配置(pom.xml)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

核心配置(application.yml)

spring:data:mongodb:uri: mongodb://root:123456@192.168.3.11:27017/mydb?authSource=admin# 或分開配置host: 192.168.3.11port: 27017username: rootpassword: 123456authentication-database: admin

2. 實體類定義

@Data
@Document(collection = "users") // 指定集合名
public class User {@Idprivate String id;@Indexed(direction = IndexDirection.ASCENDING) // 單字段索引private String name;@TextIndexed // 全文索引private String email;private Integer age;private Date createDate;
}

3. Repository接口

public interface UserRepository extends MongoRepository<User, String> {// 方法名推導查詢List<User> findByName(String name);// 自定義JSON查詢@Query("{ 'age' : { $gt: ?0 } }")List<User> findByAgeGreaterThan(int age);
}

4. MongoTemplate操作

@Autowired
private MongoTemplate mongoTemplate;// 插入文檔
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setName("Alice");
mongoTemplate.insert(user); // 插入單個文檔// 查詢所有
List<User> users = mongoTemplate.findAll(User.class);// 根據ID查詢
User user = mongoTemplate.findById("1001", User.class);// 條件查詢
Query query = new Query();
query.eq("name", "Alice").gt("age", 20);
List<User> result = mongoTemplate.find(query, User.class);// 更新文檔
Update update = new Update();
update.set("name", "NewName").inc("age", 1);
mongoTemplate.updateFirst(Query.query(Criteria.where("id").is("1001")), update, User.class);// 刪除文檔
mongoTemplate.remove(Query.query(Criteria.where("id").is("1001")), User.class);

二、聚合查詢操作

1. 使用Aggregation API

// 聚合管道:匹配+分組統計
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(Criteria.where("age").gt(18)), // 過濾年齡>18Aggregation.group("department") // 按部門分組.count().as("total") // 統計人數.avg("salary").as("avgSalary"), // 計算平均工資Aggregation.sort(Sort.Direction.DESC, "total") // 按總人數降序排序
);// 執行聚合
AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, "users", Document.class);

2. 原生JSON聚合

// 直接使用JSON格式定義聚合管道
String pipeline = "[{ $match: { age: { $gt: 18 } } }, " +"{ $group: { _id: '$department', total: { $sum: 1 }, avgSalary: { $avg: '$salary' } } }, " +"{ $sort: { total: -1 } }]";AggregationResults<Document> results = mongoTemplate.aggregate(new BasicQuery(pipeline), "users", Document.class);

三、高級功能實現

1. 全文搜索

// 1. 創建文本索引
@TextIndexed
private String title;// 2. 使用TextCriteria查詢
public List<Note> searchNotes(String keyword) {TextCriteria criteria = TextCriteria.forDefaultLanguage().matching(keyword);Query query = new Query(criteria);return mongoTemplate.find(query, Note.class);
}

2. 事務管理

@Configuration
@EnableTransactionManagement
public class MongoConfig {@Beanpublic MongoTransactionManager transactionManager(MongoDatabaseFactory factory) {return new MongoTransactionManager(factory);}
}// 服務層使用@Transactional
@Service
public class TransferService {@Transactionalpublic void transferMoney(String fromId, String toId, double amount) {// 扣減轉出賬戶mongoTemplate.updateFirst(Query.query(Criteria.where("id").is(fromId)), new Update().inc("balance", -amount), Account.class);// 增加轉入賬戶mongoTemplate.updateFirst(Query.query(Criteria.where("id").is(toId)), new Update().inc("balance", amount), Account.class);}
}

3. 連接池調優

spring:data:mongodb:uri: mongodb://user:pass@host:27017/db?maxIdleTimeMS=300000&maxPoolSize=100&minPoolSize=10&maxWaitTimeMS=1000

四、性能優化技巧

1. 分頁查詢

// 使用Pageable實現分頁
Pageable pageable = PageRequest.of(0, 10, Sort.by("age").descending());
Query query = new Query().with(pageable);
List<User> users = mongoTemplate.find(query, User.class);

2. 復合索引

@CompoundIndexes({@CompoundIndex(name = "name_age_index", def = "{'name': 1, 'age': -1}")
})
public class User {}

3. 地理位置查詢

// 創建2D索引
@Field(store = true, indexDirection = Direction.GEO2D)
private Point location;// 查詢附近5公里內的用戶
Query query = new Query();
query.near("location", new GeoJsonPoint(116.4, 39.9)).maxDistance(5000);
List<User> nearbyUsers = mongoTemplate.find(query, User.class);

五、常見異常處理

  1. 連接超時:檢查URI配置和網絡連通性,適當增加connectTimeoutMS
  2. 查詢無結果:確認數據存在且索引生效,可使用hint()強制指定索引
  3. 事務沖突:確保操作集合已存在并啟用副本集
  4. 內存溢出:聚合查詢時添加allowDiskUse(true)

完整代碼示例可參考CSDN專題教程,生產環境建議結合分庫分表、讀寫分離等高級架構設計。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79785.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79785.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【實戰教程】零基礎搭建DeepSeek大模型聊天系統 - Spring Boot+React完整開發指南

&#x1f525; 本文詳細講解如何從零搭建一個完整的DeepSeek AI對話系統&#xff0c;包括Spring Boot后端和React前端&#xff0c;適合AI開發入門者快速上手。即使你是編程萌新&#xff0c;也能輕松搭建自己的AI助手&#xff01; &#x1f4da;博主匠心之作&#xff0c;強推專欄…

Linux系統基本指令和知識指南

一、Linux系統簡介 Linux是一種自由和開放源代碼的類UNIX操作系統&#xff0c;由林納斯托瓦茲在1991年首次發布。它以穩定性、安全性和靈活性著稱&#xff0c;廣泛應用于服務器、嵌入式系統和個人計算機。 Linux主要特點&#xff1a; 開源免費 多用戶、多任務 良好的安全性…

【計算機視覺】OpenCV實戰項目:Long-Exposure:基于深度學習的長時間曝光合成技術

Long-Exposure&#xff1a;基于深度學習的長時間曝光合成技術 項目概述與技術背景項目核心功能技術原理 環境配置與安裝硬件要求建議詳細安裝步驟可選組件安裝 實戰應用指南1. 基礎使用&#xff1a;視頻轉長曝光2. 高級模式&#xff1a;自定義光軌合成3. 批量處理模式 技術實現…

TikTok 矩陣賬號運營實操細節:打造爆款矩陣

在 TikTok 的流量版圖里&#xff0c;打造 TikTok 矩陣賬號能顯著提升影響力與吸粉能力。而借助 AI 工具&#xff0c;更可為 TikTok 矩陣運營效率的提升賦能&#xff0c;讓運營如虎添翼。下面就為大家詳細講講其中的實操細節&#xff0c;并結合一些偽代碼示例輔助理解。 一、矩…

互聯網大廠Java求職面試:分布式系統中向量數據庫與AI應用的融合探索

互聯網大廠Java求職面試&#xff1a;分布式系統中向量數據庫與AI應用的融合探索 面試開場&#xff1a;技術總監與鄭薪苦的“較量” 技術總監&#xff08;以下簡稱T&#xff09;&#xff1a;鄭薪苦先生&#xff0c;請簡單介紹一下你在分布式系統設計方面的經驗。 鄭薪苦&…

【每日八股】學習 RocketMQ Day2:進階(一)

文章目錄 復習昨日內容為什么要使用消息隊列為什么選擇 RocketMQRocketMQ 的優缺點&#xff1f;談談你對 RocketMQ 的理解&#xff1f;消息隊列有哪些類型&#xff1f;RocketMQ 采用哪種消息隊列模型&#xff1f;消息的消費模式了解嗎&#xff1f;了解 RocketMQ 的基本架構嗎&a…

探索智能體開發新邊界:Cangjie Magic開源平臺體驗與解析

文章目錄 每日一句正能量前言一、Cangjie Magic的核心技術&#xff08;一&#xff09;Agent DSL架構&#xff08;二&#xff09;原生支持MCP通信協議&#xff08;三&#xff09;智能規劃功能 二、實際應用場景&#xff08;一&#xff09;智能客服系統&#xff08;二&#xff09…

深入解析進程間通信與Socket原理:從理論到TypeScript實戰

文章目錄 一、進程中如何通信1.1 管道1.1.1 核心特性1.1.2 缺點1.1.3 匿名管道與命名管道的對比 1.2 信號1.2.1 核心特性1.2.2 缺點1.2.3 信號分類對比 1.3 消息隊列1.3.1 核心特性1.3.2 缺點 1.4 共享內存1.4.1 核心特性1.4.2 缺點 1.5 信號量1.5.1 核心特性1.5.2 缺點 二、So…

力扣-hot100(旋轉圖像)

48. 旋轉圖像 中等 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像&#xff0c;這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,2,3],[4…

Docker編排工具---Compose的概述及使用

目錄 一、Compose工具的概述 二、Compose的常用命令 1、列出容器 2、查看訪問日志 3、輸出綁定的公共端口 4、重新構建服務 5、啟動服務 6、停止服務 7、刪除已停止服務的容器 8、創建和啟動容器 9、在運行的容器中執行命令 10、指定一個服務啟動容器的個數 11、其…

C25-數組應用及練習

第一題 題目: 代碼 #include <stdio.h> int main() {//數組及相關數據定義int arr[10];int i;//基于循環的數組數據輸入for(i0;i<10;i){arr[i]i;}//基于循環的數組數據輸出for(i9;i>0;i--){printf("%d ",arr[i]);}return 0; }結果 第二題 題目 代碼 …

網絡安全怎么入門?快速了解

網絡安全是一個快速發展的領域&#xff0c;入門需要系統化的學習和實踐。以下是適合零基礎或轉行者的分階段學習路徑&#xff0c;涵蓋必備知識、學習資源、實戰方法和職業方向&#xff1a; 一、基礎階段&#xff08;1-3個月&#xff09; 1. 掌握核心基礎知識 計算機網絡&#…

express 怎么搭建 WebSocket 服務器

一&#xff1a;使用 express-ws var express require(express); var app express(); var expressWs require(express-ws)(app);app.use(function (req, res, next) {console.log(middleware);req.testing testing;return next(); });app.get(/, function(req, res, next){…

【AI論文】SuperEdit:修正并促進基于指令的圖像編輯的監督信號

摘要&#xff1a;由于手動收集準確的編輯數據存在挑戰&#xff0c;現有的數據集通常使用各種自動化方法構建&#xff0c;導致編輯指令和原始編輯圖像對之間不匹配導致監督信號出現噪聲。 最近的研究試圖通過生成更高質量的編輯圖像、在識別任務上進行預訓練或引入視覺語言模型&…

關于大疆紅外圖片提取溫度方法 python 方法

思路 紅外圖片需要是黑白圖片 提取紅外圖片最高和最低溫度 溫度圖例 根據最高溫度31.2攝氏度 最低溫度19.9攝氏度 那中間的值在 0到255 之間 那有這個值之后。就可以獲取到圖片里面 每個點或者面的值 實現方式 def find_Gray(self, t_max, t_min, c_temp):"""…

金融小知識

&#x1f4c9; 一、“做空”是啥&#xff1f; 通俗說法&#xff1a;押“它會跌”&#xff0c;賺錢&#xff01; ? 舉個例子&#xff1a; 有一天老王的包子漲價到 10 塊一個&#xff0c;張三覺得這價格肯定撐不住&#xff0c;未來會跌到 5 塊。于是他&#xff1a; 向朋友借了…

JavaScript 數據存儲全攻略:從 Cookie 到 IndexedDB

1. Cookie&#xff1a;傳統的輕量級存儲 Cookie 是最早的客戶端存儲解決方案之一&#xff0c;最初設計用于服務器和客戶端之間的狀態保持。 基本用法 javascript 復制 下載 // 設置cookie document.cookie "usernameJohnDoe; expiresThu, 18 Dec 2025 12:00:00 UTC…

Leetcode 刷題記錄 09 —— 鏈表第三彈

本系列為筆者的 Leetcode 刷題記錄&#xff0c;順序為 Hot 100 題官方順序&#xff0c;根據標簽命名&#xff0c;記錄筆者總結的做題思路&#xff0c;附部分代碼解釋和疑問解答&#xff0c;01~07為C語言&#xff0c;08及以后為Java語言。 01 合并 K 個升序鏈表 /*** Definitio…

如何利用 Elastic Load Balancing 提升應用性能與可用性?

當今云計算的快速發展中&#xff0c;隨著應用需求的增加&#xff0c;如何確保系統能夠高效、穩定地處理不斷增長的流量成為了每個技術團隊關注的焦點。Elastic Load Balancing&#xff08;ELB&#xff09;作為一種強大的工具&#xff0c;能夠幫助開發者和運維人員輕松應對流量波…

Word如何制作三線表格

1.需求 將像這樣的表格整理成論文中需要的三線表格。 2.直觀流程 選中表格 --> 表格屬性中的邊框與底紋B --> 在設置中選擇無&#xff08;重置表格&#xff09;–> 確定 --> 選擇第一行&#xff08;其實是將第一行看成獨立表格了&#xff0c;為了設置中線&…