Управление преобразованием Mono и Flux - PullRequest
0 голосов
/ 10 марта 2019

Я использую 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)) Это возвращает Flux<UserParticipation>. Я должен собрать идентификаторы из ответа и позвонить 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..."

Есть идеи о том, что мне не хватает или как мне поступить?

1 Ответ

2 голосов
/ 11 марта 2019

Ваша проблема - это часть collectList(), поскольку она делает Mono из вашего Flux, который вам явно не нужен - вы создаете поток из списка сразу после сбора.Это должно сделать то же самое, плюс отображение Mono на Flux с flatMapMany:

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
...