MongoTemplate更新实体类

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

  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用MongoTemplate实体类进行增删改查的Java代码示例: 1. 定义实体类 ```java @Document(collection = "user") public class User { @Id private String id; private String name; private int age; // 省略 getter 和 setter 方法 } ``` 2. 使用MongoTemplate进行增删改查 ```java @Repository public class UserRepository { @Autowired private MongoTemplate mongoTemplate; /** * 添加用户 * @param user 用户实体类 */ public void addUser(User user) { mongoTemplate.insert(user); } /** * 根据ID删除用户 * @param id 用户ID */ public void deleteUserById(String id) { Criteria criteria = Criteria.where("_id").is(id); Query query = new Query(criteria); mongoTemplate.remove(query, User.class); } /** * 更新用户信息 * @param user 用户实体类 */ public void updateUser(User user) { Criteria criteria = Criteria.where("_id").is(user.getId()); Query query = new Query(criteria); Update update = new Update(); update.set("name", user.getName()); update.set("age", user.getAge()); mongoTemplate.updateFirst(query, update, User.class); } /** * 根据ID查询用户信息 * @param id 用户ID * @return 用户实体类 */ public User findUserById(String id) { Criteria criteria = Criteria.where("_id").is(id); Query query = new Query(criteria); return mongoTemplate.findOne(query, User.class); } /** * 查询所有用户信息 * @return 用户实体类列表 */ public List<User> findAllUsers() { return mongoTemplate.findAll(User.class); } } ``` 以上是使用MongoTemplate实体类进行增删改查的Java代码示例,其中使用了Spring Data MongoDB的注解@Document、@Id等进行实体类映射,使用了MongoTemplate的insert、remove、updateFirst、findOne、findAll等方法进行数据操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值