MongoTemplate 存在不更新 不存在则插入

简介: MongoTemplate 存在不更新 不存在则插入的方法 【非存在更新 不存在插入的逻辑】

一般来说 MongoTemplate  提供的 upsert 可以满足 存在则更新  不存在则插入的方法   【插入会自动补充 _id】


正常更新语句  

publiclongupdateCareFreeStatusByEntity(PddDelayEntityentity, TmsDelayCareFreeStatusstatus){
Queryquery=newQuery(Criteria.where("wb").is(entity.getWaybillNo()).and("oc").is(entity.getOrgCode()).and("op").is(entity.getOpCode()).and("st").is(TmsDelayCareFreeStatus.WAIT_NOTIFY.getCode()));
Updateupdate=newUpdate();
update.set("st",status.getCode());
returnmongoTemplate.updateFirst(query,update,collection_name_tms_delay_carefree_info).getMatchedCount();
    }

存在更新,不存在则插入

TmsDelayCareFreeEntitydelayCareFreeEntity=newTmsDelayCareFreeEntity();
delayCareFreeEntity.setWb("154164151461461461");
delayCareFreeEntity.setOp("131");
delayCareFreeEntity.setCuc("00025393");
delayCareFreeEntity.setCun("振德a飒飒");
delayCareFreeEntity.setCoc("532905");
delayCareFreeEntity.setOc("532905");
delayCareFreeEntity.setCt(newDate());
delayCareFreeEntity.setSubT(newDate());
Queryquery=newQuery(Criteria.where("wb").is(delayCareFreeEntity.getWb()).and("oc").is(delayCareFreeEntity.getOc()).and("op").is(delayCareFreeEntity.getOp()));
Updateupdate=newUpdate();
update.set("coc", delayCareFreeEntity.getCoc());
update.set("cun",delayCareFreeEntity.getCun());
update.set("cuc",delayCareFreeEntity.getCuc());
update.set("ct",delayCareFreeEntity.getCt());
update.set("ec",delayCareFreeEntity.getEc());
update.set("en",delayCareFreeEntity.getEn());
update.set("rt",delayCareFreeEntity.getRt());
update.set("tags",delayCareFreeEntity.getTags());
update.set("st",delayCareFreeEntity.getSt());
update.set("orgname",delayCareFreeEntity.getOrgname());
update.set("subT",delayCareFreeEntity.getSubT());
UpdateResulttmsDelayCarefreeInfo=mongoTemplate.upsert(query, update, TmsDelayCareFreeEntity.class, "tms_delay_carefree_info");


解释upsert


upsert:  和前面的 updateFirst 的区别  核心就是  upsert为 true 还是 false

  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

如果要更新的文档不存在的话会插入一条新的记录

  • multi: 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。


正常的mongoTemplate的 update 开头的方法 默认的 upsert都是 false  即不插入  

只有 upsert开头的方法 才是   upset为 true  



存在不更新,不存在则插入  


前面的 方法 是 存在更新 ,我想要的数据是 存在不更新   不存在则插入  这样才符合我的业务条件    


这个使用的方法很相似 ,只是把 set  换成  setOnInsert  

publicUpdateResultupsertCareFreeInfo(TmsDelayCareFreeEntitydelayCareFreeEntity) {
//查询条件Queryquery=newQuery(Criteria.where("wb").is(delayCareFreeEntity.getWb()).and("oc").is(delayCareFreeEntity.getOc()).and("op").is(delayCareFreeEntity.getOp()));
Updateupdate=newUpdate();
//必填字段update.setOnInsert("coc", delayCareFreeEntity.getCoc());
update.setOnInsert("ct",delayCareFreeEntity.getCt());
update.setOnInsert("rt",delayCareFreeEntity.getRt());
update.setOnInsert("tags",delayCareFreeEntity.getTags());
update.setOnInsert("st",delayCareFreeEntity.getSt());
update.setOnInsert("orgname",delayCareFreeEntity.getOrgname());
update.setOnInsert("subT",delayCareFreeEntity.getSubT());
if (ObjectUtil.isNotNull(delayCareFreeEntity.getCun())){
update.setOnInsert("cun",delayCareFreeEntity.getCun());
        }
if (ObjectUtil.isNotNull(delayCareFreeEntity.getCuc())){
update.setOnInsert("cuc",delayCareFreeEntity.getCuc());
        }
if (ObjectUtil.isNotNull(delayCareFreeEntity.getEc())){
update.setOnInsert("ec",delayCareFreeEntity.getEc());
        }
if (ObjectUtil.isNotNull(delayCareFreeEntity.getEn())){
update.setOnInsert("en",delayCareFreeEntity.getEn());
        }
returnmongoTemplate.upsert(query, update, TmsDelayCareFreeEntity.class, collection_name_tms_delay_carefree_info);
    }

【需要注意的是  除了会新增 update.setOnInsert的数据   query 中的 查询数据 也会被新增进去   以及 自动补充_id字段】


set 和 setOnInset 的区别

db.inventory.updateOne(
    { item: "paper" },
    {
$set: { "size.uom": "cm", status: "P" }, 
$currentDate: { lastModified: true }
    }
)
  • 使用$set 运算符将size.uom字段的值更新为“ cm”,将状态字段的值更新为“ P”  用来指定一个键并更新键值,若键不存在并创建。
  • 使用$currentDate运算符将lastModified字段的值更新为当前日期。 如果lastModified字段不存在,则$currentDate将创建该字段。 有关详细信息,请参见$currentDate
  • $setOnInsert操作符会将指定的值赋值给指定的字段,如果要更新的文档存在那么$setOnInsert操作符不做任何处理;


如果带有upsert: true的更新操作 导致插入文档,则将$setOnInsert指定的值分配给文档中的字段。如果更新操作没有导致插入,$setOnInsert则什么也不做。


目录
相关文章
|
运维 NoSQL 安全
【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署
结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。 适应数据规模为T级的场景,由于设计了分片支撑,后续如有大数据量需求,可分片横向扩展。
1936 1
|
Java 应用服务中间件 Android开发
IDEA 编译时 报 “常量字符串过长” 解决办法
IDEA 编译时 报 “常量字符串过长” 解决办法
4203 0
|
12月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
1897 0
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些高级用法
本文探讨了在Spring Boot项目中使用MongoDB的多种方式及其高级用法。MongoDB作为一种NoSQL数据库,在某些场景下相较于SQL数据库有着独特的优势。文中详细介绍了在Spring Boot中使用MongoDB的三种主要方式:直接使用官方SDK、使用Spring JPA以及使用MongoTemplate,并对比分析了它们之间的差异。此外,文章深入讲解了Spring Data MongoDB提供的各种注解(如@Id, @Document, @Field等)以简化操作流程,并探讨了MongoTemplate监听器的应用,如设置主键值、记录日志等。
1103 2
|
11月前
|
Java
SpringBoot快速搭建WebSocket服务端和客户端
由于工作需要,研究了SpringBoot搭建WebSocket双向通信的过程,其他的教程看了许多,感觉讲得太复杂,很容易弄乱,这里我只展示快速搭建过程。
2785 1
|
NoSQL MongoDB 关系型数据库
13个Mongodb GUI可视化管理工具,总有一款适合你
本文介绍了13个好用的MongoDB可视化工具。Robomongo,MongoDB Compass,phpMoAdmin等
116228 0
13个Mongodb GUI可视化管理工具,总有一款适合你
|
Java Spring
Spring Boot 3系列之-启动类详解
Spring Boot启动类是构建Spring Boot应用程序的关键组成部分。它允许开发人员配置和管理应用程序的行为,同时简化了应用程序的配置和部署过程。通过深入了解Spring Boot启动类的功能和用法,开发人员可以更好地构建和管理复杂的Spring Boot应用程序。希望本文能够帮助您更好地理解和使用Spring Boot启动类。
878 4
Spring Boot 3系列之-启动类详解
|
存储 NoSQL MongoDB
docker安装Mongodb
这篇文章详细说明了如何使用Docker安装MongoDB,包括拉取镜像、创建并运行容器、数据持久化存储以及访问容器内的MongoDB服务的具体步骤。
1433 1
|
easyexcel Java 关系型数据库
阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
该文章主要介绍了在Java应用中如何使用EasyExcel技术完成对Excel文件的导入和导出操作,包括环境搭建、基本概念、快速入门、进阶操作和综合应用等内容,并提供了相关代码示例和注意事项。
 阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
|
JSON 算法 安全
SpringBoot从入门到精通(三十四)如何集成JWT实现Token验证
近年来,随着前后端分离、微服务等架构的兴起,传统的cookie+session身份验证模式已经逐渐被基于Token的身份验证模式取代。接下来介绍如何在Spring Boot项目中集成JWT实现Token验证。
SpringBoot从入门到精通(三十四)如何集成JWT实现Token验证

热门文章

最新文章