如何使用 reactors Mono 更新 MongoDB 文档的新值? (科特林)

How do I update a MongoDB document with new value using reactors Mono? (Kotlin)

所以上下文是我需要更新单个文档中的值,我有一个 Mono,参数对象包含 username(通过唯一用户名找到正确的用户)和一个 金额 值。

问题是这个值(由于我的应用程序的其他组件)是我需要 increase/decrease 用户余额的值,而不是传递新的余额。我打算使用两个 Monos 来做到这一点,其中一个找到用户,然后将其与另一个 Mono 结合入站请求,在那里我可以然后执行一个简单的总和(即余额 + changeRequest.amount)然后 return 到文档数据库。

override fun increaseBalance(changeRequest: Mono<ChangeBalanceRequestResource>): Mono<ChangeBalanceResponse> {

    val changeAmount: Mono<Decimal128> = changeRequest.map { it.transactionAmount }

    val user: Mono<User> = changeRequest.flatMap { rxUserRepository.findByUsername(it.username)


    val newBalace = user.map {
        val r = changeAmount.block()
        it.balance = sumBalance(it.balance!!, r!!)
            rxUserRepository.save(it)
    }
    .flatMap { it }
    .map { it.balance!! }

    return Mono.just(ChangeBalanceResponse("success", newBalace.block()!!))
 }

显然,我正在尝试以非阻塞方式实现这一点。如果那是 possible/optimal,我也愿意只使用一个单声道。我也很感激我真正地扼杀了这个例子,并使用 .block 作为占位符来说明我正在努力实现的目标。

P.S 这是我的第一个 post,所以任何有关如何更清楚地表达我的问题的提示都会很有用。

下面是我在 Java 中的做法(使用 Double 而不是 Decimal128):

public Mono<ChangeBalanceResponse> increaseBalance(Mono<ChangeBalanceRequestResource> changeRequest) {

    Mono<Double> changeAmount = changeRequest.map(a -> a.transactionAmount());
    Mono<User> user = changeRequest.map(a -> a.username()).flatMap(RxUserRepository::findByUsername);

    return Mono.zip(changeAmount,user).flatMap(t2 -> {
       Double changeAmount = t2.getT1();
       User user = t2.getT2();
       //assumes User is chained
       return rxUserRepository.save(user.balance(sumBalance(changeAmount,user.balance())));
   }).map(res -> new ChangeBalanceResponse("success",res.newBalance()))

}