java – 使SpringData更新仅更改POJO的字段

我在MongoDB上使用Spring Data.我能够保存POJO,更新它们.它工作正常.但是现在我想在db中仅刷新POJO的更改字段.

例如,我有用户实体.我创建用户,然后不时更新lastActiveDate.

@Document
class User {
    @Id
    BigInteger ID;

    String email;

    String name;

    Date lastActiveDate;
}

User user = new User();
user.setName("User");
user.setEmail("example@example.com");
repository.save(user);

User toUpdUser = repository.findOne(userId);
toUpdUser.setLastActiveDate(new Date);
repository.save(toUpdUser );

在第二次保存中,我希望仅更新lastActiveDate字段而不是整个用户,因为文档更新在大型实体上可能很慢.另外我想知道changeset(至少是更新字段集).

目前我没有找到API来做到这一点.唯一的可能性是在setter中手动处理它(存储已更改字段的集合并手动存储)但它看起来很丑陋且不受支持.另一种选择是在bean上使用AOP来实现相同的结果,但是IFAIK Spring Data不会将POJO视为Spring bean并且使用构造函数,因此在使用AOP加载POJO之后将只是POJO.

UPD:
 我正在寻找没有明确的mongo api(或mongo-like api)调用方法.我有几十个领域的实体,客户几乎可以改变任何一个.我想只存储已更改的字段,并能够获取更改集以执行某些检查.实体存储和字段更新之间的差异太大 – 5ms vs 0.2ms

当然,我可以使用CRUD跟踪器支持创建自己的POJO映射器实现,但它已经存在,为什么不尝试它.而且我不仅可以使用另一个框架SpringData.

解决方法:

Spring-data不支持逐字段比较,以便确定哪些字段已更新并仅将这些字段发送到数据库.我确实只支持持久化非空字段,我发现自己在实现PATCH或PUT Web服务时会利用它.使用非空字段创建$set对象,您将保持文档的其他部分不变.

您需要使用MongoConverters的一些未记录的功能,这里是spring-mvc中PATCH-webservice的一个示例,它还在文档的“events”数组中维护事件的历史记录:

@RestController
public class MyWebservice {

    @Autowired
    private MongoConverter mongoConverter;

    @RequestMapping(value = "/order/{id}", method = PATCH, produces = APPLICATION_JSON_UTF8_VALUE, consumes = APPLICATION_JSON_UTF8_VALUE)
    public Order updateOrder(@PathVariable("id") String id, @RequestBody Order order) throws JsonProcessingException {
        order.setId(id);
        DBObject update = getDbObject(order);
        mongoTemplate.updateFirst(query(where("id").is(id)), Update.fromDBObject(new BasicDBObject("$set", update)).push("events", order), Order.class);
        return mongoTemplate.findOne(query(where("id").is(id)), Order.class);
    }

    private DBObject getDbObject(Object o) {
        BasicDBObject basicDBObject = new BasicDBObject();
        mongoConverter.write(o, basicDBObject);
        return basicDBObject;
    }
}

MongoConverter只会将非空值写入BasicDBObject.

相关文章

MongoTemplate 是Spring Data MongoDB 中的一个核心类,为 S...
笔者今天要分享的是一个项目重构过程中如何将数据库选型由原...
mongodb/mongoTemplate.upsert批量插入更新数据的实现
进入官网下载官网安装点击next勾选同意,点击next点击custom...
头歌 MongoDB实验——数据库基本操作
期末考试复习总结