spring-data-mongodb - 操纵 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..."
关于我缺少什么或我应该怎么做的任何想法?
解决方案
你的问题是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
推荐阅读
- android - IP地址范围的网络安全配置?
- android - 如何将可渲染的小节点放置在可渲染的较大节点的相同位置?
- python - Psychopy/Python - 访问冲突读取 0x00000010
- ruby - 将 Capybara 屏幕截图保存到功能文件夹
- javascript - 如何通过 html 选择使用 javascript 移动 html 内容
- java - 从多个路径从 Firebase 数据库获取数据
- python - 气象站项目中的KeyError
- maven - TFS 2018 神器 maven 可以支持上游 repo 吗?
- javascript - 预期 2-3 个参数,但在执行 POST 操作时有 4 个角度?
- php - Windows 10 作曲家冻结