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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…