spring - Spring Mongo 更新日期检查 - 如何防止重复键异常?
问题描述
我需要保留具有给定时间戳的文档。我只想保留/更新具有较新时间戳的文档。
通过将日期检查添加到 upsert 查询中,如果现有文档比要持久化的文档更新,我将始终得到重复键异常:
public void checkTimestampAndSave(BaseDocument object) {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(object.getId()).and("_ts").lte(object.getUpdateDate()));
Document document = new Document();
mappingMongoConverter.write(object, document);
try {
mongoTemplate.upsert(query, Update.fromDocument(document), object.getClass());
} catch (DuplicateKeyException ignored) {
//:-(
log.debug("Object has an updateDate less than the persisted object in db");
}
}
我真的不喜欢在这里依赖异常。
有没有办法 - 可以使用 AggregationUpdate 来防止异常?upsert 查询应该只包含 id(以判断是更新还是插入),更新本身应该设置一些东西(如果更新)或者什么都不做。
在 mongo“语言”中看到一种方式也将有所帮助,我将尝试将其翻译成 Spring/Java API。
解决方案
推荐阅读
- php - 多页调查问卷的控制器数量 Laravel / PHP
- php - 从数组 2 中获取与数组 1 相比的唯一值并在数组 3 中输出
- ios - SwiftUI:仅当 ScrollView 超过屏幕高度时才可滚动
- reactjs - 为什么 Jest 无法运行引用 npm 包的测试?
- python - 零测试用例的代码覆盖率很高
- python - 为什么这个 scipy 傅立叶积分函数不起作用?
- python - Python 错误:TypeError:不支持的操作数类型 -:'int' 和 'function'
- kubernetes - 如何访问同一节点中的 Pod?(舵)
- python - 在使用条件聚合进行分组时选择多个第 n 个值 - 熊猫
- mongodb - 不匹配 $ 作为正则表达式中的字符串