一般来说 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则什么也不做。