我正在使用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> { ... }
和我正在尝试使用的查询:
fooRepository.findAll(QFoo.foo.bar.name.eq("test"))
我正在使用QueryDSL 4.1.4,Spring Boot 1.5.3和Spring Data MongoDB 1.10.3
这支持吗?我错过了什么吗?
1 回答
TL; DR;
它不受支持 .
解释
您正在表达一个谓词,该谓词遵循不同文档的引用 .
MongoDB是一个面向文档的数据库,它不知道连接 . 每个文档可能包含子文档或引用(这些都是人为的) . 此外,每个文档必须单独查找或作为基于查询的文档集合提取 .
因为MongoDB没有内置的连接,所以无法跨
DBRef
引用进行查询 . 您可以表示在嵌入子文档时扫描子文档的查询 .Spring Data MongoDB以更加用户友好的方式公开MongoDB提供的功能,并且不会假装提供MongoDB不支持的功能 .
从MongoDB 3.4开始,聚合框架支持
$graphLookup
让MongoDB在聚合阶段进行查找以查找单个文档 . 查找很昂贵,而且我们宁愿避免 .