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
mongoTemplate批量保存数据mongoDB批量保存数据
mongoTemplate批量保存数据mongoDB批量保存数据
518 2
JavaWeb - Request 之 Header Key 大小写是否敏感?
JavaWeb - Request 之 Header Key 大小写是否敏感?
2192 0
|
NoSQL 索引
MongoDB查询优化:从 10s 到 10ms
本文是我前同事付秋雷最近遇到到一个关于MongoDB执行计划选择的问题,非常有意思,在探索源码之后,他将整个问题搞明白并整理分享出来。付秋雷(他的博客)曾是Tair(阿里内部用得非常官方的KV存储系统)的核心开发,目前就职于蘑菇街。
|
NoSQL MongoDB 关系型数据库
13个Mongodb GUI可视化管理工具,总有一款适合你
本文介绍了13个好用的MongoDB可视化工具。Robomongo,MongoDB Compass,phpMoAdmin等
111554 0
13个Mongodb GUI可视化管理工具,总有一款适合你
|
NoSQL MongoDB
使用MongoTemplate 对 mongodb数据进行分组、排序、分页、连表查询
使用MongoTemplate 对 mongodb数据进行分组、排序、分页、连表查询
|
监控 NoSQL MongoDB
mongodb查询100万数据如何查询快速
综上,提高MongoDB百万级数据的查询性能需要综合多项技术,并在实际应用中不断调优和实践。理解数据的特征,合理设计索引,优化查询语句,在数据访问、管理上遵循最佳的实践,这样才能有效地管理和查询大规模的数据集合。
594 1
|
存储 NoSQL 数据管理
揭秘MongoDB时间序列集合:这个超级功能将如何彻底改变你的数据管理?
【8月更文挑战第8天】时间序列数据记录随时间变化的信息,在数据库管理中至关重要。MongoDB自4.0版起引入时间序列集合,专为这类数据优化存储与查询。通过问答形式介绍其特点:自动数据过期、高效存储机制及快速查询操作。创建时需指定时间字段及可选元数据字段。支持设置数据过期时间,采用粗粒度索引减少I/O操作。查询时可通过时间范围筛选数据,并利用聚合框架进行数据分析。随着实时分析需求的增长,时间序列集合的应用将更加广泛。
635 1
|
存储 SQL NoSQL
SpringBoot 整合 MongoDB 超详细(一)
在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词:数据库、集合、文档!
12421 1
|
存储 NoSQL JavaScript
mongodb时间处理,时区处理
mongodb时间处理,时区处理
3360 2
|
NoSQL Java MongoDB
Spring Boot 整合 MongoDB 实战
本文介绍了如何使用Spring Boot整合MongoDB,实现数据持久化。步骤包括:环境准备(安装Java、MongoDB及创建Spring Boot项目)、在pom.xml中添加MongoDB依赖、配置MongoDB连接信息、创建映射MongoDB集合的实体类、定义MongoDB Repository接口、编写业务逻辑和服务层以及控制器层。通过测试确保整合成功。此实战教程帮助读者理解Spring Boot与MongoDB整合的基础,适用于快速构建Java应用。
1422 11