使用响应式java,只在flux为空时插入元素



我有一个数据库,我想在其中看到我的条目具有唯一键。但有时我需要允许键的重复,所以我不能使用索引。

我有这样的东西

Flux<Student> getStudentsBySomething(String something) {..}
Mono<Void> insert(Student student) {...}
Mono<Void> insertUnique(Student student) {
// I want to write something like
if (getStudentsBySomething().isEmpty()) {
insert(student);
} else{
throw new RuntimeException(e);
}
}

但是我真的被如何用响应式代码重写insertUnique卡住了

更新1:我想到了下面的解决方案。我想知道是否有更好的方法来做这件事。

Mono<Void> insertUnique(Student student) {
return getStudentsBySomething(student.getSomething())
.count()
.flatMap(records -> {
if (records == 0) {
return insert(student);
} else {
return Mono.error(alreadyExist(student)); 
}
});
}

也许是这样的?这样你就不必收集整个Flux了,如果有很多道具的话,这可能会很糟糕:

Mono<Void> insertUnique(Student student) {
return getStudentsBySomething("test")
.hasElements()
.flatMap(hasStudents -> {
if (!hasStudents) {
return insert(student);
} else {
throw new RuntimeException();
}
});
}
Mono<Void> insertUnique(Student student) {
getStudentsBySomething()
.collectList()
.flatMap(students -> {
if(students.isEmpty()) {
return insert(student);
} else {
throw new RuntimeException(e);
}
};
}