Как мне обновить документ MongoDB новым значением, используя реакторы Mono? (Kotlin) - PullRequest
0 голосов
/ 13 марта 2020

Таким образом, контекст заключается в том, что мне требуется обновить значение в одном документе, у меня есть Mono , параметр Object содержит значения, такие как username (чтобы найти правильного пользователя по уникальному имени пользователя) и сумма значение.

Проблема в том, что это значение (из-за других компонентов моего приложения) является значением, на которое мне нужно увеличивать / уменьшать баланс пользователей, а не пропускать новый баланс. Я намереваюсь сделать это, используя два Monos , где один находит пользователя, затем это объединяется с другим Mono с входящим запросом, где я могу затем выполнить простую сумму (т.е. баланс + changeRequest .amount), затем верните его в базу данных документов.

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()!!))
 }

Очевидно, я пытаюсь добиться этого неблокирующим образом. Я также открыт для использования только одного Mono, если это возможно / оптимально. Я также ценю, что я действительно разбил пример и использовал .block в качестве заполнителя для иллюстрации того, чего я пытаюсь достичь.

PS Это мой первый пост, поэтому любые советы о том, как express мой Прояснение проблемы было бы полезно.

1 Ответ

0 голосов
/ 13 марта 2020

Вот как я бы сделал это в 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()))

}
...