应用范围
需要原子操作,发现后修改,没发现就新增。
mongodb中操作
中文文档:https://docs.mongoing.com/can-kao/mongo-shell-methods/collection-methods/db-collection-findandmodify
其中文档中介绍的很清楚,这里不复制。
举例一
新增一条数据
db.testmo.insert({ "name":"wuxing", "age":12, "code":"1" })
此时查询结果
查询并更新
db.testmo.findAndModify({ query : {"code":"1"}, update : {"name":"shangjiang", "age":18} })
此时查询文档为:
注意此时其中没有了code字段了
查询不到就新增
文档中没有code为2的,此时会新增一条
db.testmo.findAndModify({ query : {"code":"2"}, update : {"name":"shangjiang", "age":18}, upsert:true })
spring mogodb驱动中操作
用mongoTemplate.findAndModify方法进行操作
文档位置:https://docs.spring.io/spring-data/mongodb/docs/3.2.4/api/,挨个查看方法中用到的对象
Controller代码
@GetMapping("/query2") public void query2() throws ServiceException { dayReportService.query2(); }
Service代码
这里应用的
@Nullable
@Override
public <T> T findAndModify(Query query, UpdateDefinition update, FindAndModifyOptions options, Class<T> entityClass) {
return findAndModify(query, update, options, entityClass, getCollectionName(entityClass));
}
public void query2(){ String code = "code2"; Criteria criteria = new Criteria("code").is(code); Query query = new Query(criteria); Update update = new Update(); update.set("name", "wuxing"); update.set("age", 12); update.set("code", code); FindAndModifyOptions findAndModifyOptions = new FindAndModifyOptions(); findAndModifyOptions.upsert(true); mongoTemplate.findAndModify(query, update, findAndModifyOptions, Testmo.class); }
Testmo代码
public class Testmo { private String name; private String age; private String code; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
以上,调用接口测试就好。
有其他的需求看看官方文档就好: