首页 > 解决方案 > 操纵 Mono 和 Flux 转换

问题描述

我正在使用带有 ReactiveMongoRepositories 的 Spring 5 webflux。假设我有 2 个集合“Race”和“RaceParticipation”:

    Race : {
    "_id" : "ID",
    "name" : "Name"
    }

    RaceParticipation : {
    "_id" : "ID",
    "userId" : "ID",
    "raceId" : "ID"
    }

我需要找到给定用户参与的竞赛页面。

我采用的解决方案是调用raceParticipationRepository.findByUserId("userId", PageRequest.of(0,10)) 这返回一个Flux<UserParticipation>. 我应该从 response 和 call 中收集 id raceRepository.findAllById(ids)

这是一个片段:

Flux<Race> findUserRaces(String userId, int page){
    return raceParticipationRepository.findByUserId(userId, status,
                PageRequest.of(page, 6))
            .collectList()
            .map(list -> list.stream()
                    .map(ParticipationRepository::getRaceId)
                    .collect(Collectors.toList()))
            .flatMap(list -> raceRepository.findAllById(list));
}

此代码无法编译。"Required Flux<Race> but flatMap was inferred to Mono..."

关于我缺少什么或我应该怎么做的任何想法?

标签: spring-data-mongodbspring-webfluxproject-reactor

解决方案


你的问题是collectList()部分,因为它从你的 Flux 中制作了一个 Mono,这显然是你不想要的——你在收集后立即从列表中制作一个流。这里应该做同样的事情,加上使用 flatMapMany 将 Mono 映射到 Flux:

raceParticipationRepository.findByUserId(userId, status,
            PageRequest.of(page, 6))
      .map(ParticipationRepository::getRaceId)
                .collectList(Collectors.toList()) // returns Mono<List>
      .flatMapMany(list -> raceRepository.findAllById(list)); // Mono -> Flux again

推荐阅读