Air*_*iry 8 java mongodb spring-data-mongodb
我是 MongoDB 和 Reactor 的新手,我正在尝试检索用户及其关联的配置文件 这是 POJO :
public class User {
private @Id String id;
private String login;
private String hashPassword;
@Field("profiles") private List<String> profileObjectIds;
@Transient private List<Profile> profiles; }
public class Profile {
private @Id String id;
private @Indexed(unique = true) String name;
private List<String> roles; }
Run Code Online (Sandbox Code Playgroud)
问题是,如何在 User POJO 中注入配置文件?
我知道我可以放置 @DBRef 并解决问题,但在它的文档中,MongoDB 指定手动 Ref 应该优先于 DB ref。
我看到了两种解决方案:
当我得到它时填写 pojo :
public Mono<User> getUser(String login) {
return userRepository.findByLogin(login)
.flatMap(user -> ??? );
}
Run Code Online (Sandbox Code Playgroud)我应该对profileRepository.findAllById()做一些事情,但我不知道或连接两个发布者,因为配置文件结果取决于用户结果。
但在这里我错了,因为方法在结果发布之前就结束了
public void onAfterConvert(AfterConvertEvent<User> event) {
final User source = event.getSource();
source.setProfiles(new ArrayList<>());
profileRepository.findAllById(source.getProfileObjectIds())
.doOnNext(e -> source.getProfiles().add(e))
subscribe();
}
Run Code Online (Sandbox Code Playgroud)
mp9*_*1de 10
DBRef反应式 Spring Data MongoDB不支持,我不确定会有。
Spring Data 项目被组织成模板 API、转换器和映射元数据组件。Template API 的命令式(阻塞)实现使用命令式方法来获取Documents 并将它们转换为域对象。MappingMongoConverter特别是处理所有的转换和DBRef解析。此 API 在同步/命令式 API 中工作,并用于模板 API 实现(命令式和反应式)。
MappingMongoConverter在添加响应式支持时,重用是合乎逻辑的决定,因为我们不需要复制代码。唯一的限制是DBRef不适合反应式执行模型的分辨率。
为了支持reactive DBRefs,转换器需要分成几个位,整个关联处理需要大修。
参考:https : //jira.spring.io/browse/DATAMONGO-2146
将引用保留为域模型中的键/ID,并根据需要查找它们。zipWith和flatMap是适当的运算符,具体取决于您要存档的内容(使用引用增强模型,仅查找引用)。
相关说明:Reactive Spring Data MongoDB 部分带有减少的功能集。上下文 SpEL 扩展是一项不受支持的功能,因为这些组件采用命令式编程模型,因此采用同步执行。
对于第一点,我终于做到了我想做的事:
public Mono<User> getUser(String login) {
return userRepository.findByLogin(login)
.flatMap( user ->
Mono.just(user)
.zipWith(profileRepository.findAllById(user.getProfileObjectIds())
.collectionList(),
(u, p) -> {
u.setProfiles(p);
return u;
})
);
}
Run Code Online (Sandbox Code Playgroud)