【问题标题】:How do I update a MongoDB document with new value using reactors Mono? (Kotlin)如何使用 reactor Mono 更新具有新值的 MongoDB 文档? (科特林)
【发布时间】:2020-06-25 08:56:45
【问题描述】:

所以上下文是我需要更新单个文档中的值,我有一个 Mono,参数 Object 包含诸如 username 之类的值(查找通过唯一用户名正确用户)和 amount 值。

问题是这个值(由于我的应用程序的其他组件)是我需要增加/减少用户余额的值,而不是传递新的余额。我打算使用两个 Mono 来执行此操作,其中一个找到用户,然后将其与入站请求结合到另一个 Mono,然后我可以在其中执行简单的求和(即 balance + 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 作为占位符来说明我想要实现的目标。

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

【问题讨论】:

    标签: mongodb kotlin project-reactor


    【解决方案1】:

    下面是我在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()))
    
    }
    

    【讨论】:

    • 嘿,Prashant,刚开始尝试这个解决方案,效果很好
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2018-07-21
    • 2017-01-06
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多