【问题标题】:Query DBRef with Spring Data MongoDB using QueryDSL使用 QueryDSL 使用 Spring Data MongoDB 查询 DBRef
【发布时间】:2017-10-31 14:56:12
【问题描述】:

我正在使用 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

支持吗?我错过了什么吗?

【问题讨论】:

    标签: mongodb spring-data spring-data-mongodb querydsl


    【解决方案1】:

    TL;DR;

    不支持。

    说明

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

    MongoDB 是一个不知道连接的面向文档的数据库。每个文档都可能包含子文档或参考资料(它们是人工的)。此外,必须单独查找每个文档或根据查询将每个文档作为文档集合获取。

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

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

    从 MongoDB 3.4 开始,聚合框架支持$graphLookup 让 MongoDB 在聚合阶段查找单个文档。查找成本高昂,这是您希望避免的。

    【讨论】:

    • 除了$graphLookup还有别的方法吗?
    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多