使用 QueryDSL 使用 Spring Data MongoDB 查询 DBRef

Chr*_*ouy 5 mongodb querydsl spring-data spring-data-mongodb

我正在使用 Spring Data MongoDB 和 QueryDSL 来执行一些简单的查询,但是我在尝试将谓词与 DBRef 对象的字段一起使用时遇到了问题。

似乎 DBRef 没有解析,所以查询总是返回空结果。从 2014 年开始,这个话题主要有一些问题,虽然似乎在 QueryDSL 和 Spring Data 方面都做了一些工作,但我仍然无法让它工作,也没有找到任何工作示例。

我正在寻找一个简单的解决方案,如以下简化的测试用例:

@Document
class Foo {
    @Id Integer id;
    @DBref Bar bar;
}

@Document
class Bar {
    @Id Integer id;
    String name;
}

interface FooRepository extends MongoRepository<Foo, Integer>, QueryDslPredicateExecutor<Foo> { ... }
Run Code Online (Sandbox Code Playgroud)

以及我尝试使用的查询:

fooRepository.findAll(QFoo.foo.bar.name.eq("test"))
Run Code Online (Sandbox Code Playgroud)

我正在使用 QueryDSL 4.1.4、Spring Boot 1.5.3 和 Spring Data MongoDB 1.10.3

这是支持的吗?我错过了什么吗?

mp9*_*1de 2

TL;博士;

不支持。

解释

您正在表达一个谓词,该谓词跟随不同文档的引用。

MongoDB 是一个面向文档的数据库,不支持连接。每个文档可能包含子文档或参考文献(这是人造的)。此外,每个文档必须单独查找或基于查询作为文档集合获取。

由于 MongoDB 没有内置联接,因此您无法跨DBRef引用进行查询。您可以表达在嵌入子文档时扫描子文档的查询。

Spring Data MongoDB 以更加用户友好的方式公开 MongoDB 提供的功能,并且不会假装提供 MongoDB 支持的功能。

从 MongoDB 3.4 开始,聚合框架支持$graphLookup让 MongoDB 在聚合阶段查找单个文档。查找的成本很高,您应该避免这种情况。