MongoDB与Spring Data如何有条件地追加销售



目前正在尝试使用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操作请求的确认级别,如insertupdateremove等。

换句话说,您的应用程序告诉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操作,这应该会解决你的问题,对吧?

最新更新