如何在 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 号码。端点收到 userId 和 verificationCode。如果集合中的令牌与用户发送的令牌匹配,则将用户集合中的验证更新为真。
我正在尝试编写一个将由该端点调用并进行所需更改的函数。
我尝试了以下代码,但验证状态没有更新为 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())
我有 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 号码。端点收到 userId 和 verificationCode。如果集合中的令牌与用户发送的令牌匹配,则将用户集合中的验证更新为真。
我正在尝试编写一个将由该端点调用并进行所需更改的函数。
我尝试了以下代码,但验证状态没有更新为 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())