gpt4 book ai didi

java - 如何将数据库引用与响应式(Reactive) Spring Data MongoDB 一起使用?

转载 作者:可可西里 更新时间:2023-11-01 10:02:05 25 4
gpt4 key购买 nike

我是 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 中注入(inject)配置文件?

我知道我可以放置一个@DBRef 并解决问题,但在它的文档中,MongoDB 指定手动 Ref 应该优先于 DB ref。

我看到了两种解决方案:

  1. 当我得到 pojo 时填写它:

    public Mono<User> getUser(String login) {
    return userRepository.findByLogin(login)
    .flatMap(user -> ??? );
    }

我应该用 profileRepository.findAllById() 做点什么,但我不知道或连接两个发布者,因为配置文件结果取决于用户结果。

  1. 声明一个 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();
}

最佳答案

长话短说

响应式(Reactive) Spring Data MongoDB 中没有 DBRef 支持,我不确定会有。

说明

Spring Data 项目被组织成模板 API、转换器和映射元数据组件。模板 API 的命令式(阻塞)实现使用命令式方法获取 Document 并将它们转换为域对象。 MappingMongoConverter 特别处理所有转换和 DBRef 解析。此 API 在同步/命令式 API 中工作,并用于两种模板 API 实现(命令式和响应式(Reactive))。

重用 MappingMongoConverter 是添加响应式支持的合乎逻辑的决定,因为我们不需要重复代码。唯一的限制是 DBRef 解析不适​​合响应式(Reactive)执行模型。

为了支持响应式 DBRef,转换器需要拆分成多个位,并且整个关联处理需要大修。

引用:https://jira.spring.io/browse/DATAMONGO-2146

推荐

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

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

关于java - 如何将数据库引用与响应式(Reactive) Spring Data MongoDB 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50058861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com