方法一:缺点:代码量大,若实体类属性太多,需要写很多update.set
优点:最大的适用性,可通过增加if判断控制是否更新当前属性(比如为空不更新,应对某些特殊需求)。
TestBean t = new TestBean();
t.setId("123");
t.setName("lisi2222");
t.setAge(123);
t.setDesc("DESC");
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(t.getId()));
Update update = new Update();
update.set("name", t.getName());
update.set("age", t.getAge());
update.set("desc", t.getDesc());
mongoTemplate.upsert(query, update, "aaa");
方法二:优点,代码量小,不需要写太多update.set;
缺点:有的限制场景无法使用(如一条记录有多个来源,1个来源只更新其中几个属性);
更新整个实体类,完全以TestBean为准,若删除t.setDesc(“DESC”);则数据库中也删除了
换成Map也如此
//Map t= new HashMap<>();
//t.put("_id", "123");
//t.put("name", "ss");
TestBean t = new TestBean();
t.setId("123");
t.setName("lisi2222");
t.setAge(123);
t.setDesc("DESC");
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(t.getId()));
DBObject dbDoc = new BasicDBObject();
mongoTemplate.getConverter().write(t, dbDoc);
Update update = Update.fromDBObject(dbDoc);
//Update update = Update.fromDBObject(dbDoc,"age","desc");删掉key=age和desc的属性
mongoTemplate.upsert(query, update, "aaa");
可通过如下方法实现方法一
public static Update fromDBObjectExcludeNullFields(DBObject object) {
Update update = new Update();
for (String key : object.keySet()) {
Object value = object.get(key);
if(value!=null){
update.set(key, value);
}
}
return update;
}
方法三:优点:代码简洁,
缺点:只能用map(只有需要更新的key-value),若用实体类,会更新全部属性
推荐使用,通过Map插入完美避开缺点。
@Test
public void updateDB() throws Exception {
Map t= new HashMap<>();
t.put("_id", "123");
t.put("name", "sss");
t.put("sex", "man");
Query query = new Query();
query.addCriteria(Criteria.where("name").is(t.get("name")));
performUpsert(query,t,"aaa");
}
public void performUpsert(Query upsertQuery, Object object, String collectionName){
ObjectMapper mapper = new ObjectMapper();
try {
String jsonStr = mapper.writeValueAsString(object);
DB db = mongoTemplate.getDb();
DBCollection collection = db.getCollection(collectionName);
DBObject query = upsertQuery.getQueryObject();
DBObject update = new BasicDBObject("$set", JSON.parse(jsonStr));
collection.update(query, update, true, false);
} catch (IOException e) {
}
}
方法四:通过save来实现更新,限制较大,缺点如方法二,但比方法二代码量小
@Id
private String id;
// Map t= new HashMap<>();
// t.put("_id", "123");
// t.put("name", "zhangsan");
TestBean t = new TestBean();
t.setId("123");
t.setName("sss");
// t.setAge(33);
// t.setDesc("efg");
mongoTemplate.save(t,"aaa");
方法五:同方法三一样
Map t= new HashMap<>();
t.put("name", "sss");
t.put("age", 33);
// t.put("desc", "desc");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(t);
try {
JSONObject jsonObject = new JSONObject(json);
DBObject update1 = new BasicDBObject("$set", JSON.parse(json));
mongoTemplate.getCollection("aaa").update(new Query(Criteria.where("name").is(jsonObject.getString("name"))).getQueryObject(), update1, true, false);
} catch (Exception e) {
}
update.set("key1", "value1") 把"key1"对应的值设置为"value1",如果数据中不存在"key1",则会新增加一条信息key1:value1
update.inc("sum", 100) inc累加计算,即sum在原来基础上加上100,相当于sum=sum+100
update.multiply("sum", 100) 乘法计算,即sum在原来基础上乘以100,相当于sum=sum*100
update.rename("key2", "k2") rename用于修改键值, 即把"key2":"value2"修改为"k2":"value2"
update.unset("key3") 删除键为"key3"的信息,即从文档中移除该键
update.pull("array", "a1") 删除array数组中的"a1"。 例如"array":["a1","a2","a3"],删除"a1"后的结果 "array":["a2","a3"]
update.pullAll("array", Object[] values) 可一次性删除数组内多个值
update.push("array","a3") 向array数组里添加"a3"(不会检查数组中元素是否重复), 数组"array"不存在则会新建该数组。修改后结果"array":["a2","a3","a3"]
update.pushAll("array", Object[] values) 可一次性向数组内添加多个值
update.addToSet("array","a3") 向array数组里添加"a3"(会检查数组中元素是否重复), 数组"array"不存在则会新建该数组。修改后结果"array":["a2","a3"]
update.pop("array",Update.Position.FIRST) 从"array"数组 开头/结尾(Update.Position.FIRST/Update.Position.LAST) 移除一个元素
template.updateFirst(query, update, collectionName); //更新符合query条件的第一条数据
template.updateMulti(query, update, collectionName);//更新符合query条件的所有数据
template. upsert(query, update, collectionName); //更新符合条件时如果不存在则会新增加一条数据,相当于执行了insert()方法
参考:1、https://stackoverflow.com/questions/20001627/mongotemplate-upsert-easy-way-to-make-update-from-pojo-which-user-has-editted
2、https://www.cnblogs.com/qingming/p/6419474.html