我是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; }

问题是,如何在用户POJO中注入配置文件?

我知道我可以放一个@DBRef来解决问题,但是在它的文档中,MongoDB指定手动Ref应该比DB ref更可取。

我看到了两种解决方案:
  • 当我得到它时,填满pojo:
    public Mono<User> getUser(String login) {
        return userRepository.findByLogin(login)
        .flatMap(user -> ??? );
    }
    

  • 我应该对 profileRepository.findAllById()做些事情,但是鉴于配置文件的结果取决于用户的结果,我不知道或不能将两个发布者并置。
  • 声明一个AbstractMongoEventListener并重写onAfterConvert方法:

  • 但是在这里我错了,因为方法在结果发布之前就结束了
    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();
    }
    

    最佳答案

    TL; DR

    响应式Spring Data MongoDB中不存在DBRef支持,我不确定是否会有。

    说明

    Spring Data项目被组织为Template API,Converter和Mapping Metadata组件。模板API的命令性(阻塞)实现使用命令性方法来获取Document并将其转换为域对象。 MappingMongoConverter特别处理所有转换和DBRef解析。此API在同步/命令式API中工作,并且用于两种模板API实现(命令式和响应式)。

    重复使用MappingMongoConverter是合乎逻辑的决定,同时添加了响应式支持,因为我们不需要重复代码。唯一的限制是DBRef分辨率不适合反应式执行模型。

    为了支持反应性DBRef,需要将转换器分成几个位,并且整个关联处理都需要大修。

    参考:https://jira.spring.io/browse/DATAMONGO-2146

    建议

    将引用保留为您的域模型中的键/ ID,并根据需要查找它们。 zipWithflatMap是适当的运算符,具体取决于要归档的内容(带有引用的增强模型,仅查找引用)。

    相关说明:响应式Spring Data MongoDB部分带有简化的功能集。上下文SpEL扩展是一项不受支持的功能,因为这些组件采用命令式编程模型,因此需要同步执行。

    07-24 13:34