【发布时间】:2021-01-15 05:35:13
【问题描述】:
我有一个 pojo,如下所示:
@Document
public class MyPojo {
@Id
private String id;
...
@CreatedDate
private ZonedDateTime createdAt;
@LastModifiedDate
private ZonedDateTime modifiedAt;
}
我想用以下逻辑插入一个文档:
- 如果文档是新文档,
createdAt和modifiedAt都设置为now。 - 如果文档已经存在,
createdAt不应更新,modifiedAt应设置为now。
我尝试了以下代码:
MongoTemplate template = ...; // wired
MyPojo obj = new MyPojo();
template.findAndReplace(
new Query().addCriteria(...),
obj,
new FindAndReplaceOptions().upsert());
这里,成员id、createdAt 和modifiedAt 未设置(因此它们是null)。
这似乎不起作用。数据库中文档 BSON 中的相应字段从不设置。
如何结合@CreatedDate 和@LastModifiedDate 注释来插入文档?这是可能的,还是我需要推出自己的东西。如果是后者,如何实现上述的 upsert 逻辑?
我正在使用以下配置:
@Configuration
@EnableMongoAuditing(dateTimeProviderRef = "dateTimeConverter")
这里,dateTimeProviderRef 用于支持ZonedDateTime 对象。
另外,我注意到当调用template.save(obj) 或template.insert(obj) 而不是findAndReplace(...)(如在我的代码sn-p 中)时,设置了createdAt 和modifiedAt创造,正如预期的那样。也就是说,我相信我需要 findAndReplace(),因为我需要一个原子 upsert 发生。
【问题讨论】:
标签: java spring mongodb spring-data spring-data-mongodb