操纵 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
我正在使用 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