操纵 Mono 和 Flux 转换

Manipulating Mono and Flux transformation

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

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

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

我需要找到指定用户参加过的比赛页面。

我采用的解决方案是调用 raceParticipationRepository.findByUserId("userId", PageRequest.of(0,10)) 这returns个Flux<UserParticipation>。 我应该从响应中收集 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..."

知道我缺少什么或我应该怎么做吗?

你的问题是 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