情况如下:我有两个mongodb文档:用户和复制。
在检查用户是否有复制条目(文档)的基础上,我想在mongodb中添加另一个实体。
目前我正在使用SpringWebFlux和SpringMongo。请参阅下面的代码。
@Autowired
ParserRepository parserRepository;
@Autowired
ReproductionRepository reproductionRepository;
@Autowired
UserRepository userRepository;
public void addParser(Parser parser, String keycloakUserId) {
Mono<User> userMono = userRepository.findByKeycloakUserId(keycloakUserId);
Mono<Reproduction> reproductionMono = reproductionRepository.findById(parser.getReproductionId());
userMono.zipWith(reproductionMono)
.filter(objects -> objects.getT2().getUserId().equals(objects.getT1().get_id()))
.then(parserRepository.save(parser))
.switchIfEmpty(Mono.error(new ParserDoesNotBelongToUserException("Unable to add, since this parser does not belong to you")));
}
我的问题如下:如何使用mono的结果来验证是否存在正确的mono,并基于save解析器文档。基本上结合两个mono流的结果来执行另一个文档的保存,并以非阻塞的方式执行。
上述方法显然不起作用。在这种情况下,用两个单独的单声道来做这个场景的最佳方法是什么?欢迎提供任何最佳实践提示。
1条答案
按热度按时间5ktev3wc1#
取自
Mono#filter
文件:筛选器( predicate <?super t>tester)如果这个mono有值,测试结果并在 predicate 返回true时重放它。
因此,如果筛选器的计算结果为true,它将通过该值,如果为false,则不会。
问题是你在打电话
then
之后。文档Mono#then
然后(单声道其他)让这个单声道完成,然后播放另一个单声道。这里的关键词是
complete
这基本上意味着,不管前一行用什么结束,它都被忽略,只要它结束。因此,无论它在前一行中用(false/true)完成了什么,我们运行它都无关紧要then
不管怎样。我猜你想要的是: