当前位置: 首页 > 知识库问答 >
问题:

SpringWebFlux:如何比较两个Mono流的结果并基于过滤器进行保存

齐冥夜
2023-03-14

情况如下:我有两个MongoDB文档:用户和复制。

在检查用户是否有复制条目(文档)的基础上,我想在MongoDB中添加另一个实体。

目前我正在使用SpringWebFlux和SpringReactiveMongo。请参阅下面的代码。

    @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是否存在,并基于该保存解析器文档。基本上结合两个单声道流的结果,以便执行另一个文档的保存,并以非阻塞的方式执行此操作。

上述方法似乎不起作用。在这种情况下,用两个独立的单声道来完成这个场景的最佳方式是什么?欢迎任何最佳实践提示。

共有1个答案

狄冥夜
2023-03-14

摘自Mono#filter文档:

过滤器(谓词)

因此,如果过滤器的计算结果为true,它将通过该值,如果为false,则不会。

问题是您在之后调用然后。单声道的文件

然后(单声道其他)让这个单声道完成,然后播放另一个单声道。

这里的关键词是complete,这基本上意味着,不管前面的行以什么形式完成,只要它完成了,它就会被忽略。因此,不管它在前一行中用(false/true)完成了什么,我们都可以运行,然后运行

我猜你想要这样的东西:

userMono.zipWith(reproductionMono).flatMap(objects -> {
    if(objects.getT2().getUserId().equals(objects.getT1().get_id()))) {
        return parserRepository.save(parser)
    } else {
        return Mono.error(new ParserDoesNotBelongToUserException("Unable to add, since this parser does not belong to you"));
    }
}
    

 类似资料:
  • 请查看以下使用RestTemplate的controller代码(添加注释): 现在,我正试图通过反应式编程实现同样的目标。我现在使用WebFlux中的WebClient和Mono。但是,我很困惑如何将结果结合起来?看一看下面的代码(在任何地方都使用Mono,其余代码保持不变) 问题1:我们如何整合一切,形成一个Mono对象,并将其作为响应发送出去? 问题2:“CourseInfo CourseI

  • 我正在使用Kafka和Spark 2.1结构化流。我有两个json格式的数据主题,例如: 我需要比较Spark中基于标记的两个流:name,当值相等时,执行一些额外的定义/函数。 如何使用Spark结构化流来做到这一点? 谢谢

  • 我想获得客户总购买的平均值并将其存储在@x中 然后我想存储供应商总采购的平均值,并将其存储在@Y中

  • 我在一个线程组中有几个采样器,每个采样器检索一条信息。然后我需要验证来自两个不同采样器的结果的一致性。特别是,我需要断言一个采样器响应中的字段是否等于JDBC响应中的字段。做这样的事情最好的方法是什么? 我曾考虑过向每个采样器添加一个beanshell后处理器,以便从每个样本中提取字段值并将其保存在两个变量中,然后添加一个访问这些变量的beanshell断言,但我想知道是否有更直接的方法。 在JM

  • 我需要基于另一个流过滤一个流,并获取所有匹配条目的计数。 我已经尝试了以下和各种其他组合,但它没有按预期工作。 这个想法是: < li >对于从0到256的每个数字(流1) < li >查看该号码是否出现在另一个列表中(流2 ),如果出现的话 < li >计算出现次数除以流2中的元素总数(18)。 < li >如果没有出现,请收集0。 这基本上是根据流 2 中的出现次数查找流 1 中数字的频率。

  • 我有以下课程: