MongoTemplate中setOnInsert與set方法的深度解析

MongoTemplate中setOnInsert與set方法的深度解析

在Spring Data MongoDB的MongoTemplate中,setOnInsertset方法都是在更新文檔時使用的,但它們在處理upsert操作(即,如果文檔不存在則插入,存在則更新)時扮演著截然不同的角色。

核心區別:操作的觸發時機

setOnInsertset最核心的區別在于它們執行的條件:

  • set(): 無論操作是更新現有文檔還是插入新文檔,set()方法指定的字段都會被設置或更新。
  • setOnInsert(): setOnInsert()方法指定的字段僅在upsert操作導致新文檔被插入時才會被設置。如果upsert操作匹配到了現有文檔并進行更新,那么setOnInsert()中的設置將被忽略。

可以簡單地理解為,setOnInsert是為新插入的文檔設置一個初始值或默認值,而set則是對文檔進行常規的更新。

使用場景與代碼示例

setOnInsertset通常與upsert: true選項結合使用。 upserttrue意味著,如果查詢條件沒有找到匹配的文檔,MongoDB將會創建一個新的文檔。

場景示例: 假設我們有一個products集合,我們希望在產品首次被添加到數據庫時設置一個默認的庫存數量(defaultQty),同時在每次更新時都更新產品的名稱(item)。

使用MongoTemplate實現:

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;// ...public void upsertProduct(MongoTemplate mongoTemplate, String productId, String itemName) {Query query = new Query(Criteria.where("_id").is(productId));Update update = new Update().set("item", itemName).setOnInsert("defaultQty", 100);mongoTemplate.upsert(query, update, "products");
}

操作結果分析:

  • productId對應的文檔不存在時:

    • upsert操作會創建一個新的文檔。
    • set("item", itemName)會被執行,新文檔的item字段被設置為itemName
    • setOnInsert("defaultQty", 100)也會被執行,新文檔的defaultQty字段被設置為100
    • 最終插入的文檔為:{ "_id": productId, "item": "newItemName", "defaultQty": 100 }
  • productId對應的文檔已存在時:

    • upsert操作會匹配到現有的文檔。
    • set("item", itemName)會被執行,現有文檔的item字段被更新為新的itemName
    • setOnInsert("defaultQty", 100)將被忽略,因為沒有發生插入操作。
    • 如果原文檔是{ "_id": productId, "item": "oldItemName", "defaultQty": 50 },更新后的文檔將是{ "_id": productId, "item": "newItemName", "defaultQty": 50 }

注意事項

  • 字段不能重復: 在同一個Update對象中,同一個字段不能同時出現在set()setOnInsert()中,否則會引發錯誤。
  • upsert是關鍵: setOnInsert的效果完全依賴于upsert操作。如果upsertfalse(默認情況),setOnInsert將永遠不會生效。

總結

總的來說,setsetOnInsert為在MongoTemplate中執行upsert操作提供了強大的靈活性:

方法描述使用場景
set()無論文檔是插入還是更新,都設置或更新指定的字段。需要對字段進行常規更新,不論其是否存在。
setOnInsert()僅在upsert操作插入新文檔時設置指定的字段。為新創建的文檔設置創建時間、初始狀態、默認值等一次性屬性。

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

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

相關文章

利用OJ判題的多語言優雅解耦方法深入體會模板方法模式、策略模式、工廠模式的妙用

在線評測系統(Online Judge, OJ)的核心是判題引擎,其關鍵挑戰在于如何高效、安全且可擴展地支持多種編程語言。在博主的項目練習過程中,借鑒了相關設計模式實現一種架構設計方案,即通過組合運用模板方法、策略、工廠等…

[FOC電機控制]霍爾傳感器于角度問題

如果電機有1對極(p1,那么每旋轉一圈的機械角度,電氣角度會轉動一圈(360)。如果電機有2對極(p2,那么每旋轉一圈的機械角度,電氣角度會轉動兩圈(720)。

阿里云 Flink

阿里云 Flink 是阿里云基于Apache Flink打造的企業級實時計算平臺,旨在為用戶提供高效、穩定、易用的流處理與批處理能力,幫助企業快速構建實時數據處理鏈路,支撐實時業務決策。核心特性流批一體計算繼承 Apache Flink “流批一體” 的核心優…

企業級高性能web服務器

1 web服務基礎 1.1 正常情況的單次web服務訪問流程: 正常情況下,單次 Web 服務訪問流程從用戶在客戶端發起請求開始,到最終在客戶端展示內容結束,涉及客戶端、網絡傳輸、服務器端等多個環節,以下是詳細過程&#xff…

免費PDF編輯軟件 pdf24-creator 及其安裝包

最近發現了一款還算是不錯的PDF編輯和閱讀軟件 pdf24-creator,官方下載網站為:https://tools.pdf24.org/zh/creator,但是官方下載如果沒有魔法的話,下載速度很慢,比百度網盤下載還滿,因此我把它分享到網盤。…

openvela之ADB

ADB(Android Debug Bridge)是一款功能豐富的命令行工具,旨在實現開發工作站與設備(如模擬器、實體設備)之間的通信。通過 ADB,開發者可以便捷地在設備上執行命令、傳輸文件、調試應用等。本文將詳細介紹 AD…

如何控制需求交付節奏

有效控制需求的交付節奏,其核心在于將產品開發過程從一個不可預測的、時快時慢的混亂狀態,轉變為一套產出穩定、流程順暢、步調可持續的系統化交付機制。要成功構建這套機制,實現有節奏的價值交付,必須綜合運用五大關鍵策略&#…

匯編中常用寄存器介紹

X86-32位寄存器 4個數據寄存器:EAX、EBX、ECX和EDX; 2個變址和指針寄存器:ESI和EDI; 2個指針寄存器:ESP和EBP; 1個指令指針寄存器:EIP; 6個段寄存器:ES、CS、SS、DS、FS和GS; 1個標志寄存器:EFlags。 在X8…

SOMGAN:用自組織映射改善GAN的模式探索能力

論文信息 論文題目:Improving mode exploring capability ofgenerative adversarial nets by self-organizing map(利用自組織映射提高生成對抗網絡的模式探索能力) 期刊:Neurocomputing 摘要:生成對抗網絡(GANs)的出現將生成模型的研究推向了一個新的高潮。支持這一進步…

《匯編語言:基于X86處理器》第12章 復習題和練習

本篇記錄了《匯編語言:基于X86處理器》第12章 復習題和練習的筆記。12.6復習題和練習12.6.1 簡答題1.假設有二進制浮點數1101.01101,如何將其表示為十進制分數之和?答:1101.01101(1x)(1x)(0x)(1x)(0x)(1x)(1x)(1x)(1x) 13.406252.為什么十進…

ApacheCon Asia 2025 中國開源年度報告:Apache Doris 國內第一

上周剛落下帷幕的 ApacheCon Asia 2025 中,一個數據讓所有人都為之震撼:全球 Apache 基金會項目 OpenRank 排行榜中,Apache Doris 位居第二,在中國 Apache 項目中更是穩居第一。 這個排名意味著什么?在 Apache 基金會管…

Pytest中實現自動生成測試用例腳本代碼

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快在Python的測試框架中,我們通常會針對某個系統進行測試用例的維護,在對龐大系統進行用例維護時,往往會發現很多測試用例是差不多…

一周學會Matplotlib3 Python 數據可視化-標注 (Annotations)

鋒哥原創的Matplotlib3 Python數據可視化視頻教程: 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib,學習Matplotlib圖形參數基本設置&…

安全合規1--實驗:ARP欺騙、mac洪水攻擊、ICMP攻擊、TCP SYN Flood攻擊

一、實驗環境 (思科的云實驗平臺)攻擊機:Kali Linux(IP:192.168.234.128,MAC:00:00:29:35:64:EC)目標1:網關(IP:192.168.234.2,MAC:00:50:56:ED:D…

Linux下GCC的C++實現Hive到Snowflake數據遷移

程序結構 ├── main.cpp ├── config.json ├── hive_export/ ├── parquet_data/ ├── sql_scripts/ └── logs/核心代碼實現 (main.cpp) #include <iostream> #include <fstream> #include <vector> #include <thread> #include <mut…

drippingblues靶機教程

一、信息搜集首先將其在VirtualBOX中安裝&#xff0c;并將kali與靶機都設置為橋接模式緊接著我們掃描IP&#xff0c;來發現靶機地址&#xff0c;經過搜集&#xff0c;發現IP是192.168.1.9&#xff0c;我們去訪問一下緊接著我們掃一下開放了哪些端口。發現開放了21、22以及80端口…

39.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--擴展功能--調整發布腳本

這篇文章&#xff0c;我們要調整發布腳本。之所以要調整發布腳本&#xff0c;是因為現在我們的項目有三個環境&#xff1a;本地&#xff08;Local&#xff09;、開發&#xff08;Development&#xff09;、生產&#xff08;Production&#xff09;。Tip&#xff1a;我們的項目雖…

商品、股指及ETF期權五檔盤口Tick級與分鐘級歷史行情數據多維解析

在金融數據分析領域&#xff0c;本地CSV文件是存儲高頻與低頻數據的常用載體。本文以期權市場數據為例&#xff0c;探討如何基于CSV格式處理分鐘級行情、高頻Tick數據、日頻數據、逐筆委托記錄、五檔訂單簿及歷史行情數據&#xff0c;并提供專業的技術實現方案。以下將從數據預…

云端軟件工程智能代理:任務委托與自動化實踐全解

云端軟件工程智能代理&#xff1a;任務委托與自動化實踐全解 背景與未來趨勢 隨著軟件工程復雜度不斷提升&#xff0c;開發者對自動化工具的依賴也日益增強。我們正進入一個“人機協作”的新時代&#xff0c;開發者可以專注于核心創新&#xff0c;將重復性、繁瑣的任務委托給智…

making stb style lib(1): do color print in console

col.h: see origin repo // origin repo: https://github.com/resyfer/libcol #ifndef _COL_HOL_H_ #define _COL_HOL_H_#include <stdlib.h> #include <stdio.h> #include <stdbool.h> #include <string.h> #include <math.h> // 新增&#xf…