MongoTemplate更新实体类

  • Post author:
  • Post category:其他


方法一:缺点:代码量大,若实体类属性太多,需要写很多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<String,Object> 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<String,Object> 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<String,Object> 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<String,Object> 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



版权声明:本文为jiangshuanshuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。