使用QueryDSL在Spring Data MongoDB中查询DBRef

5
我正在使用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个回答

2

TL;DR;

不支持。

Explanation

您正在将跟随引用的谓词表达式转移到不同的文档中。

MongoDB是一种面向文档的数据库,不支持连接。每个文档都可以包含子文档或引用(这些引用有点人工生成)。此外,每个文档必须根据查询单独查找或作为文档集合获取。

由于MongoDB没有内置连接,因此无法查询跨DBRef引用。您可以将子文档扫描作为嵌入式子文档的查询表达式。

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

自MongoDB 3.4以来,聚合框架支持$graphLookup,让MongoDB在聚合阶段进行查找以查找单个文档。查找是昂贵的,因此最好避免。


1
除了 $graphLookup,还有其他的方法吗? - tranceholic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接