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

How to update multiple mongo collections inside the same function in spring webflux?

我有 2 个合集 mongoDB:

1.users集合,包含用户phone号,是否通过验证?

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

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

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


我正在 Spring WebFlux 中创建一个端点来验证 phone 号码。端点收到 userIdverificationCode。如果集合中的令牌与用户发送的令牌匹配,则将用户集合中的验证更新为真。

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

我尝试了以下代码,但验证状态没有更新为 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 时你没有处理 return 从而打破了事件链。你应该尝试这样的事情:

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 链接您的操作。也不要 return null return Mono<Void> (Mono.empty())