Java 如何在reactor中编码以更新cassandra DB记录中的特定字段

Java 如何在reactor中编码以更新cassandra DB记录中的特定字段,java,spring-data,project-reactor,Java,Spring Data,Project Reactor,我正在使用ReactiveCassandraRepository,我可以创建如下新记录 public Mono<String> saveAbc(Abc toBeSaved) { return abcRepository.save(toBeSaved).map(saved -> saved.getId()); } public Mono saveAbc(Abc tobesave){ 返回abcRepository.save(tobesave.map)(saved->sa

我正在使用ReactiveCassandraRepository,我可以创建如下新记录

public Mono<String> saveAbc(Abc toBeSaved) {
    return abcRepository.save(toBeSaved).map(saved -> saved.getId());
}
public Mono saveAbc(Abc tobesave){
返回abcRepository.save(tobesave.map)(saved->saved.getId());
}
但我无法想象如何更新数据库记录中的特定字段,因为涉及两个反应式操作(findById&save)

我编写了如下代码来创建或更新状态(如果存在),但似乎不起作用

public Mono<String> saveAbc(Abc toBeSaved) {
    return abcRepository.findById(toBeSaved.getId())
        .map(current -> abcRepository.save(transform(toBeSaved, current)).map(saved -> saved.getId()))
        .flatMap(id -> id);
}

private Abc transform(Abc toBeSaved, Abc current) {
    if(current == null) {
        return toBeSaved;
    } else {
        current.setStatus(toBeSaved.getStatus());
        return current;
    }
}
public Mono saveAbc(Abc tobesave){
返回abcRepository.findById(toBeSaved.getId())
.map(当前->保存.save(转换(toBeSaved,当前)).map(保存->保存的.getId())
.flatMap(id->id);
}
私有Abc转换(Abc toBeSaved,Abc current){
如果(当前==null){
返回到保存状态;
}否则{
current.setStatus(toBeSaved.getStatus());
回流;
}
}

有人能帮忙吗?

我希望你的推荐人的方法是这样的:

interface AbcRepository {
    Mono<Abc> findById(String id);

    Mono<Abc> save(Abc abc);
}
public Mono<String> saveAbc(Abc toBeSaved) {
    return abcRepository.findById(toBeSaved.getId()) // (1)
            .map(abc -> transform(toBeSaved, abc))   // (2)
            .defaultIfEmpty(toBeSaved)               // (3)
            .flatMap(abcRepository::save)            // (4)
            .map(Abc::getId);                        // (5)
}

private Abc transform(Abc toBeSaved, Abc current) {
        current.setStatus(toBeSaved.getStatus());
        return current;
}

在上面的示例中,我希望您的存储库在findById没有找到任何匹配的Abc时发出一个完整的信号,从而将Mono作为空的完成(使用时就是这种情况!)。如果存储库在这种情况下发出异常,您可以使用

.onErrorResume(t -> Mono.just(toBeSaved))

我希望您的abcRepository的方法看起来像这样,而不是
defaultIfEmpty
(3)。

interface AbcRepository {
    Mono<Abc> findById(String id);

    Mono<Abc> save(Abc abc);
}
public Mono<String> saveAbc(Abc toBeSaved) {
    return abcRepository.findById(toBeSaved.getId()) // (1)
            .map(abc -> transform(toBeSaved, abc))   // (2)
            .defaultIfEmpty(toBeSaved)               // (3)
            .flatMap(abcRepository::save)            // (4)
            .map(Abc::getId);                        // (5)
}

private Abc transform(Abc toBeSaved, Abc current) {
        current.setStatus(toBeSaved.getStatus());
        return current;
}

在上面的示例中,我希望您的存储库在findById没有找到任何匹配的Abc时发出一个完整的信号,从而将Mono作为空的完成(使用时就是这种情况!)。如果存储库在这种情况下发出异常,您可以使用

.onErrorResume(t -> Mono.just(toBeSaved))

而不是
defaultIfEmpty
(3)。

这怎么不起作用?你们看到错误消息了吗?并没有记录任何错误,但对象并没有在数据库中持久化。这是怎么回事?你们看到错误消息了吗?并没有任何错误记录,但对象并没有在数据库中持久化。非常感谢MtTracer提供的详细答案。我将再次测试和响应。但这需要几天的时间。这个答案是正确的,而且很详细。我们的问题是用上面的答案解决的,非常感谢大家。@SimonBaslé在上面的答案中,transform方法改变了可变对象的状态。对吗?对象是否应该是不可变的?将原始参数等更改为saveAbc方法可能是危险的(因为repo可能返回了另一个更完整的实例),但在当前情况下,abc是通过转换返回的,即映射函数的输入。很好,非常感谢你详细的回答。我将再次测试和响应。但这需要几天的时间。这个答案是正确的,而且很详细。我们的问题是用上面的答案解决的,非常感谢大家。@SimonBaslé在上面的答案中,transform方法改变了可变对象的状态。对吗?对象是否应该是不可变的?将原始参数等更改为saveAbc方法可能是危险的(因为repo可能返回了另一个更完整的实例),但在当前情况下,abc是通过转换返回的,即映射函数的输入。这很好