首页 > 解决方案 > Spring ReactiveMongoTemplate 使用嵌入对象查询对象

问题描述

我的模型是一个包含不同类型对象集合的对象,

class A {
String id;
String field1;
Set<B> beesInA;
}

class B {
String id;
String name;
}

我想找到一个 ID 为 idB 的 B 实例,它属于一个 id 为 idA 的 A 实例,即

选择 B 其中 A.id = idA 和 A.beesInA.id = idB

只有 A 类是document具有相应存储库RepoAextends ReactiveMongoRepository<A, String>

如何使用ReactiveMongoTemplatefor编写查询RepoA,将Mono<B>根据上述条件返回?

同样,如何更新使用上述条件找到的 B 实例?

标签: javaspringmongodb-queryreactive-programming

解决方案


感谢Oliver Drotbohm的回答,我能够得到我需要的结果

Query query = Query.query(Criteria.where("id").is("idA").and("beesInA.id").is("idB"));
query.fields().include("beesInA.$");

template.findOne(query, A.class).flatMapIterable(A::getBeesInA).single();

B的特定实例的更新非常相似

Query query = Query.query(Criteria.where("id").is("idA").and("beesInA.id").is("idB"));
Update update = new Update().set("beesInA.$", updatedBObject);

template.findAndModify(query,
                    update,
                    new FindAndModifyOptions().returnNew(true),
                    A.class)
                    .flatMapIterable(A::getBeesInA)
                    .filter(b -> b.getId().equalsIgnoreCase("idB")
                    .single();

这篇文章ReactiveMongoTemplate包含有关使用with的完整信息ReactiveMongoRepository


推荐阅读