1.先说一下坑之所在
public boolean updateById(SimpleFeedEntity entity, String id) {
Query query = Query.query(Criteria.where("id").is(id));
Update update = buildUpdateFromObject(entity, Arrays.asList("id", "tenantId", "orgId", "appId", "createBy", "categoryType"));
update.currentDate("updateTime");
mongoTemplate.updateFirst(query, update, SimpleFeedEntity.class);
return true;
}
mongoTemplate.updateFirst() 这个方法, 如果传入的实体有字段没有赋值, update之后, mongo里值会置为null.
{
"_id": ObjectId("62f34c99b9852679528db1e8"),
"name": "上门喂饭",
"categoryId": "62f34c86b9852679528db1e7",
"firstFree": "FREE_START",
"startStatus": "STOP",
"prices": {
"min": 10,
"max": 12
},
"durations": {
"min": 20,
"max": 30
},
"tenantId": "1475652926985990144",
"orgId": "1475653337667072000",
"status": "ONLINE",
"openSearch": false,
"createdBy": "1475653653863067648",
"updateBy": "1475653653863067648",
"createTime": ISODate("2022-08-10T06:13:45Z"),
"updateTime": ISODate("2022-08-10T08:08:52Z"),
"delFlag": true,
"categoryIds": null,
"description": null,
"feedId": null,
"summary": null,
"synFeedIds": null,
"synOrgIds": null,
"weeklyEnum": null
}
大部分情况下为null的数据并不会产生什么影响,但是总归是不太好的, 所以推荐mongo的update使用下面这种方式
public boolean saveById(SimpleFeedEntity entity, String objectId) {
Query query = Query.query(Criteria.where("id").is(objectId));
SimpleFeedEntity originEntity = mongoTemplate.findOne(query, SimpleFeedEntity.class);
if (null != originEntity){
BeanUtil.copyProperties(entity,originEntity, CopyOptions.create().setIgnoreNullValue(true));
originEntity.setUpdateTime(new Date());
originEntity.setUpdateBy(IAuthService.getUserId());
mongoTemplate.save(originEntity);
return true;
}
return false;
}
先根据objectId将原数据查出来, 再将传入的实体中变化的值覆盖, 这样不会产生为null的数据