java - 如何在 spring webflux 中的同一函数内更新多个 mongo 集合?

标签 java mongodb spring-webflux

我的 mongoDB 中有 2 个集合:

1.users集合,包含用户电话号码以及是否经过验证?

{
   _id: '12123',
   phones: [ 
      {
         phoneNumber: '1234567890',
         verified: false
      }
   ]
}

  2. verificationTokens 集合,其中包含由用户集合中的 id 映射为 userId 的验证码。

{
   _id: '1111',
   userId: '12123',
   token: '4545'
}


我正在 Spring WebFlux 中创建一个端点来验证电话号码。端点接收userIdverificationCode。如果集合中的 token 与用户发送的 token 匹配,则将用户集合中的 verifyed 更新为 true。

我正在尝试编写一个由该端点调用的函数并进行所需的更改。

我尝试了以下代码,但验证状态未更新为 true。

   public Mono<VerifyPhoneToken> verifyPhoneNumber(String id, String verificationCode) {
        return verifyPhoneTokensRepository.findByUserId(id)
                .flatMap(vpt -> {
                    if (verificationCode.equals(vpt.getToken())) {
                        usersRepository.findById(id)
                                .flatMap(user -> {
                                    user.getPhones().get(0).setVerified(true);
                                    return usersRepository.save(user);
                                });
                        return verifyPhoneTokensRepository.save(vpt);
                    }
                    return null;
                });
    }

另外,我想知道是否可以以更好的方式处理return null

最佳答案

我猜你的问题是当你调用usersRepository时您没有处理返回,从而破坏了事件链。你应该尝试这样的事情:

public Mono<VerifyPhoneToken> verifyPhoneNumber(String id, String verificationCode) {
    return verifyPhoneTokensRepository.findByUserId(id)
            .flatMap(vpt -> {
                if (verificationCode.equals(vpt.getToken())) {
                    return updateUser(id)
                            .then(verifyPhoneTokensRepository.save(vpt));
                }
                return Mono.empty();
            });
}

private Mono<User> updateUser(String id) {
    return usersRepository.findById(id)
            .flatMap(user -> {
                user.getPhones().get(0).setVerified(true);
                return usersRepository.save(user);
            });
}

使用 then链式你的行动。也不回null返回Mono<Void> (Mono.empty())

关于java - 如何在 spring webflux 中的同一函数内更新多个 mongo 集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57679770/

相关文章:

java - JPanel 的 JButtons 自定义绘图出现图形故障

node.js - Mongoose 模式方法是 "not a function"

MongoDB 按键和总和值聚合映射

spring-webflux - 将对 OutputStream 的写入转换为 ServerResponse 可用的 Flux<DataBuffer>

java - Spring webflux : how to publish event from sync call for async processing?

java - 尽管设置了用户代理,但来自 Java 应用程序(但不是 Web 浏览器)的 HTTP 403

java - Android - 将 ViewGroups 子项剪辑到多个可绘制区域之一

java - 捕获并记录响应正文

mongodb - 存储变化很大的字符串,从很长到很短::Fragmentation

spring-boot - Reactive Redis 不会持续发布对 Flux 的更改