目前正在尝试使用Spring数据在MongoDB上实现更新操作。
public class Student {
@Indexed(unique = true)
@NotNull
private String studentId;
private Long triggerTime;
...
}
我实际想要实现的是有条件追加销售。(如果存在则更新/如果不基于studentId则创建(,只要持久化的学生文档的triggerTime较旧即可。
阅读关于用WriteConcern.ACKNOWLEDGED
配置WriteConcernResolver
的内容,如下所示:
public WriteConcern resolve(MongoAction action) {
if (action.getCollectionName().getClass().getSimpleName().contains("Student")) {
return WriteConcern.ACKNOWLEDGED;
}
return action.getDefaultWriteConcern();
}
但我不了解MongoAction
对象以及如何创建它。或者我完全走错了方向??
您有点困惑。
写关注点它是全局高级连接配置,用于定义MongoDB为write
操作请求的确认级别,如insert
、update
、remove
等。
换句话说,您的应用程序告诉MongoDB服务器所期望的最小确认(ACK(。
https://docs.mongodb.com/manual/reference/write-concern/
upstart是MongoDB更新方法的选项,用于在没有文档符合查询条件时创建新文档。默认情况下为false
,所以当没有匹配的文档时,将忽略更新条件。如果是true
,它将使用query
+update
参数中定义的字段创建新文档。
看看它是如何工作的:
//search a student
Query query = new Query();
query.addCriteria(Criteria.where("studentId").is("1"));
//update condition
Update update = new Update();
update.set("triggerTime", System.currentTimeMillis());
mongoOperation.upsert(query, update, Student.class);
它将尝试通过studentId
进行匹配
-如果找到,它将用当前时间更新triggerTime
-如果找不到,则插入studentId:"1", triggerTime:current time
的新文档,其他字段为null
(如果Student
类有更多字段(。
不幸的是,没有运行单个查询的条件追加启动
您需要手动操作:搜索-应用业务逻辑-创建/保存/忽略
我不确定这是否有帮助,但在我看来,它就像Mongo-Update查询(https://docs.mongodb.com/manual/reference/method/db.collection.update/)允许一个"query"参数,该参数将影响它所作用的数据。如果你编写一个语义为other.studentId NOT EXISTS OR (other.studentId EXISTS AND other.triggerTime < this.triggerTime)
的查询,并将该查询传递给你的Mongo upstart操作,这应该会解决你的问题,对吧?