MongoTemplate常用api學習

本文只介紹常用的api,盡量以最簡單的形式學會mongoTemplate基礎api的使用

一、新增

主要包含三個api:insert(一個或遍歷插多個)、insertAll(批量多個)、save(插入或更新)

//這里簡單演示,具體要插入的數據自己構建哈User user = new User();
mongoTemplate.insert(user,集合名);  //新增一個
mongoTemplate.save(user,集合名);    //根據主鍵id判斷,如果數據庫中已有id就更新,沒有就新增List<User> list = new ArrayList<>();
mongoTemplate.insert(list,集合名);     //新增多個(遍歷插入)
mongoTemplate.insertAll(list,集合名);  //新增多個(批量插入,效率高)

二、刪除

從這里開始就要引入CriteriaQuery的概念?

Criteria是條件邏輯(僅包含where部分),支持鏈式編程,一般寫法如下:
.where(第一個字段).is(精確匹配)
.and(其余條件).xxx(匹配條件)

常見匹配條件有這些:

.lt(value)? ?<value的
.lte(value)? ?≤value的
.eq(value)? ?=value的
.gte(value)? ?≥value的
.gt(value)? ?>value的
.in(a,b,c..)? ? ?元素符合a,b,c等等中的其中一個
.nin(a,b,c...)? ? 不符合a,b,c等等的任何一個
.exist(value)? ? 存在value字段的
.regex(String re)? ? 正則表達式匹配

Query是完整的查詢條件,在query可以添加其他邏輯(即limit,order by等等),支持鏈式編程,有以下功能:

.skip(long skip)? 跳過文檔的數量,配合limit做分頁(類似offset和limit)
.limit(int limit)? ?限制返回多少條
.with(Sort sort)? ? 設置排序

簡單說一下排序怎么用哈,舉個例子
.with(Sort.by(Sort.Direction.DESC,"classNo")),就是按classNO字段降序排序,我相信你懂了


最終mongoTemplate api通常要Query作為參數,構建方法有兩種:
①先創建Criteria,處理完傳入Query
②先new一個空Query,再手動add Criteria條件

//方法1
Criteria criteria = Criteria.where("name").is("hzj").and("id").is("0936");     //鏈式構造where條件
Query query = new Query(criteria);       //創建查詢條件,把where條件傳進去//方法2
Query query = new Query();
query.addCriteria(Criteria.where("name").is("hzj"));
query.addCriteria(Criteria.where("id").is("0936"));

好繼續說刪除,如下。這里User.class可以不寫哈(如果寫了就是嚴格匹配,刪除符合查詢條件且符合實體類映射的文檔,如果不寫就是刪除符合查詢條件的)

Query query = new Query(Criteria.where("name").is("John"));
mongoTemplate.remove(query, User.class,集合名);

?三、修改

需要構建一個update對象,聲明你要改哪些地方
傳query(匹配要改的文檔),update(改什么),集合名

Query query = new Query(Criteria.where("name").is("John"));
Update update = new Update().set("age", 26);
//更新第一個匹配的文檔
mongoTemplate.updateFirst(query, update, 集合名);
//更新所有匹配的文檔
mongoTemplate.updateMulti(query, update, 集合名);

update提供的常見方法如下:

Update update = new Update();
// 設置字段值
update.set("field", value);
// 遞增數值
update.inc("count", 1);
// 添加元素到數組
update.push("items", item);
// 從數組移除元素
update.pull("items", item);
// 重命名字段
update.rename("oldName", "newName");
// 取消設置字段
update.unset("field");

四、查找

使用findOne函數,只查一條文檔;

// 創建查詢條件
Criteria criteria = Criteria.where("age").gt(20);
Query query = new Query(criteria);User user = mongoTemplate.findOne(query, User.class,集合名);

如果要查多條文檔就用find函數

// 創建查詢條件
Criteria criteria = Criteria.where("age").gt(20);
Query query = new Query(criteria);// 添加排序
query.with(Sort.by(Sort.Direction.DESC, "age"));//查詢符合條件的多個記錄
List<User> users = mongoTemplate.find(query, User.class,集合名);
//查詢符合記錄的條數
int count = mongoTemplate.count(query, User.class,集合名);

(如果你有主鍵id,也可以用findById函數,傳參依次是id、返參.class、集合名)?

五、聚合管道

有點厲害,這個可以取代query,也可以做聯表用,先介紹聯表怎么做:

在mongodb中使用aggregate聚合進行聯表(你可以理解為sql中的left join)

LookupOperation lookup = LookupOperation.newLookup().from("要關聯的集合名")      // 對應 SQL 的 FROM 表.localField("當前集合字段")  // 對應 SQL JOIN 的左邊字段.foreignField("關聯集合字段") // 對應 SQL JOIN 的右邊字段.as("輸出字段名");          // 關聯結果存放的字段名Aggregation aggregation = Aggregation.newAggregation(lookup);
AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, 集合名, Document.class
);

?可作where條件

// 等同于 find() 中的查詢條件
Aggregation.match(Criteria.where("status").is("A").and("qty").gt(10))

可做select用

// 選擇包含/排除字段,可重命名字段,計算新字段
Aggregation.project().and("name").as("productName")  // 重命名.and("price").multiply(1.1).as("priceWithTax")  // 計算.andExclude("_id")  // 排除字段

可做group by用

// 按category分組,計算每組的統計值
Aggregation.group("category").count().as("count")  // 計數.sum("qty").as("totalQty")  // 求和.avg("price").as("avgPrice")  // 平均值.max("price").as("maxPrice")  // 最大值

可做order by用

Aggregation.sort(Sort.Direction.DESC, "totalQty", "avgPrice")

可做分頁用

Aggregation.skip(10),
Aggregation.limit(5)

還有展開數組,多維度聚合,圖搜索等功能,這里先不說(還沒咋學哈哈),后續再補?

如果多階段如下
// 統計各部門各年齡段的平均工資
Aggregation agg = Aggregation.newAggregation(Aggregation.match(Criteria.where("salary").gt(3000)),  // 階段1:篩選Aggregation.group("department", "age")                // 階段2:分組.avg("salary").as("avgSalary"),Aggregation.sort(Sort.Direction.DESC, "avgSalary"),   // 階段3:排序Aggregation.limit(10)                                // 階段4:限制結果
);AggregationResults<Document> results = mongoTemplate.aggregate(agg, 集合名, Document.class
);

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

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

相關文章

006網上訂餐系統技術解析:打造高效便捷的餐飲服務平臺

網上訂餐系統技術解析&#xff1a;打造高效便捷的餐飲服務平臺 在數字化生活方式普及的當下&#xff0c;網上訂餐系統成為連接餐飲商家與消費者的重要橋梁。該系統以菜品分類、訂單管理等模塊為核心&#xff0c;通過前臺展示與后臺錄入的分工協作&#xff0c;為管理員和會員提…

網絡攻防技術五:網絡掃描技術

文章目錄 一、網絡掃描的基礎概念二、主機發現三、端口掃描1、端口號2、端口掃描技術3、端口掃描隱秘策略 四、操作系統識別五、漏洞掃描六、簡答題1. 主機掃描的目的是什么&#xff1f;請簡述主機掃描方法。2. 端口掃描的目的是什么&#xff1f;請簡述端口掃描方法及掃描策略。…

生成JavaDoc文檔

生成 JavaDoc 文檔 1、快速生成 文檔 注解 2、常見的文檔注解 3、腳本生成 doc 文檔 4、IDEA工具欄生成 doc 文檔 第一章 快速入門 第01節 使用插件 在插件工具當中&#xff0c;找到插件 javaDoc 使用方式&#xff0c;在代碼區域&#xff0c;直接點擊右鍵。選擇 第02節 常用注…

大數據-276 Spark MLib - 基礎介紹 機器學習算法 Bagging和Boosting區別 GBDT梯度提升樹

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; 大模型篇章已經開始&#xff01; 目前已經更新到了第 22 篇&#xff1a;大語言模型 22 - MCP 自動操作 FigmaCursor 自動設計原型 Java篇開…

【HarmonyOS 5】如何優化 Harmony-Cordova 應用的性能?

以下是針對 ?Harmony-Cordova 應用性能優化?的完整方案&#xff0c;結合鴻蒙原生特性和Cordova框架優化策略&#xff1a; ??一、渲染性能優化? ?減少布局嵌套層級? 使用扁平化布局&#xff08;如 Grid、GridRow&#xff09;替代多層 Column/Row 嵌套&#xff0c;避免冗…

數據庫管理-第332期 大數據已死,那什么當立?(20250602)

數據庫管理332期 2025-06-02 數據庫管理-第332期 大數據已死&#xff0c;那什么當立&#xff1f;&#xff08;20250602&#xff09;1 概念還是技術2 必然的大數據量3 離線到實時4 未來總結 數據庫管理-第332期 大數據已死&#xff0c;那什么當立&#xff1f;&#xff08;202506…

相機--RGBD相機

教程 分類原理和標定 原理 視頻總結 雙目相機和RGBD相機原理 作用 RGBD相機RGB相機深度&#xff1b; RGB-D相機同時獲取兩種核心數據&#xff1a;RGB彩色圖像和深度圖像&#xff08;Depth Image&#xff09;。 1. RGB彩色圖像 數據格式&#xff1a; 標準三通道矩陣&#…

神經符號集成-三篇綜述

講解三篇神經符號集成的綜述&#xff0c;這些綜述沒有針對推薦系統的&#xff0c;所以大致過一下&#xff0c;下一篇帖子會介紹針對KG的兩篇綜述。綜述1關注的是系統集成和數據流的宏觀模式“是什么”&#xff1b;綜述3關注的是與人類理解直接相關的中間過程和決策邏輯的透明度…

window/linux ollama部署模型

模型部署 模型下載表: deepseek-r1 win安裝ollama 注意去官網下載ollama,這個win和linux差別不大,win下載exe linux安裝ollama 采用docker方式進行安裝: OLLAMA_HOST=0.0.0.0:11434 \ docker run -d \--gpus all \-p 11434:11434 \--name ollama \-v ollama:/root/.ol…

計算A圖片所有顏色占B圖片紅色區域的百分比

import cv2 import numpy as npdef calculate_overlap_percentage(a_image_path, b_image_path):# 讀取A組和B組圖像a_image cv2.imread(a_image_path)b_image cv2.imread(b_image_path)# 將圖像從BGR轉為HSV色彩空間&#xff0c;便于顏色篩選a_hsv cv2.cvtColor(a_image, c…

每日算法 -【Swift 算法】盛最多水的容器

盛最多水的容器&#xff1a;Swift 解法與思路分析 &#x1f4cc; 問題描述 給定一個長度為 n 的整數數組 height&#xff0c;每個元素表示在橫坐標 i 處的一條垂直線段的高度。任意兩條線段和 x 軸構成一個容器&#xff0c;該容器可以裝水&#xff0c;水量的大小由較短的那條…

云原生安全基礎:Linux 文件權限管理詳解

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 在云原生環境中&#xff0c;Linux 文件權限管理是保障系統安全的核心技能之一。無論是容器化應用、微服務架構還是基礎設施即代碼&#xff08;IaC&#xf…

TypeScript 中的字面量類型(Literal Types)

在 TypeScript 中&#xff0c;字面量類型&#xff08;Literal Types&#xff09;是一種特殊的類型&#xff0c;它允許你將變量的類型限制為某個具體的值&#xff08;如特定的字符串、數字或布爾值&#xff09;&#xff0c;而不僅僅是寬泛的類型&#xff08;如 string、number&a…

晶臺光耦在手機PD快充上的應用

光耦&#xff08;光電隔離器&#xff09;作為關鍵電子元件&#xff0c;在手機PD快充中扮演信號隔離與傳輸的“安全衛士”。其通過光信號實現電氣隔離&#xff0c;保護手機電路免受高電壓損害&#xff0c;同時支持實時信號反饋&#xff0c;優化充電效率。 晶臺品牌推出KL817、KL…

python學習打卡day43

DAY 43 復習日 作業&#xff1a; kaggle找到一個圖像數據集&#xff0c;用cnn網絡進行訓練并且用grad-cam做可視化 浙大疏錦行 數據集使用貓狗數據集&#xff0c;訓練集中包含貓圖像4000張、狗圖像4005張。測試集包含貓圖像1012張&#xff0c;狗圖像1013張。以下是數據集的下…

大數據與數據分析【數據分析全棧攻略:爬蟲+處理+可視化+報告】

- 第 100 篇 - Date: 2025 - 05 - 25 Author: 鄭龍浩/仟墨 大數據與數據分析 文章目錄 大數據與數據分析一 大數據是什么&#xff1f;1 定義2 大數據的來源3 大數據4個方面的典型特征&#xff08;4V&#xff09;4 大數據的應用領域5 數據分析工具6 數據是五種生產要素之一 二 …

uniapp 開發企業微信小程序,如何區別生產環境和測試環境?來處理不同的服務請求

在 uniapp 開發企業微信小程序時&#xff0c;區分生產環境和測試環境是常見需求。以下是幾種可靠的方法&#xff0c;幫助你根據環境處理不同的服務請求&#xff1a; 一、通過條件編譯區分&#xff08;推薦&#xff09; 使用 uniapp 的 條件編譯 語法&#xff0c;在代碼中標記…

青少年編程與數學 02-020 C#程序設計基礎 15課題、異常處理

青少年編程與數學 02-020 C#程序設計基礎 15課題、異常處理 一、異常1. 異常的分類2. 異常的作用小結 二、異常處理1. 異常處理的定義2. 異常處理的主要組成部分3. 異常處理的作用小結 三、C#異常處理1. 異常的基本概念2. 異常處理的關鍵字3. 異常處理的流程4. 自定義異常5. 異…

云原生時代 Kafka 深度實踐:05性能調優與場景實戰

5.1 性能調優全攻略 Producer調優 批量發送與延遲發送 通過調整batch.size和linger.ms參數提升吞吐量&#xff1a; props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384); // 默認16KB props.put(ProducerConfig.LINGER_MS_CONFIG, 10); // 等待10ms以積累更多消息ba…

在 Dify 項目中的 Celery:異步任務的實現與集成

Celery 是一個強大而靈活的分布式任務隊列系統&#xff0c;旨在幫助應用程序在后臺異步運行耗時的任務&#xff0c;提高系統的響應速度和性能。在 Dify 項目中&#xff0c;Celery 被廣泛用于處理異步任務和定時任務&#xff0c;并與其他工具&#xff08;如 Sentry、OpenTelemet…