如何仅返回 Spring Data MongoDB 中查询的特定字段?

Posted

技术标签:

【中文标题】如何仅返回 Spring Data MongoDB 中查询的特定字段?【英文标题】:How to return only specific fields for a query in Spring Data MongoDB? 【发布时间】:2015-11-13 13:07:48 【问题描述】:

我们如何在 Spring Data Mongo 中选择特定字段。我尝试了以下方法,但我得到了从FooString 的转换异常。

使用@Query

@Query(value="path : ?0", fields="path : 0")
String findPathByPath(String path);

@Query

String findPathByPath(String path);

这是文档模型

@Document(collection = "foo")
public class Foo  

  String name, path;
  …

【问题讨论】:

你在说什么? MongoDB 没有列。 我只想返回模型中的特定字段。在 sql 中,它相当于 SELECT path FROM foo @Oliver Drotbohm - 如果我们能从两者中找出不同的记录,有什么办法吗? 【参考方案1】:

您可以使用以下查询来获取特定字段。

@Query(fields="path : 1")
Foo findPathByPath(String path);

数据库中存在的记录


    "name" : "name2",
    "path" : "path2"
,

    "name" : "name3",
    "path" : "path3"

如果 path=Path3,以下查询将返回 Foo 对象


    "name": null,
    "path": "path3"

我们需要用 fieldName:1 指定必填字段,如果不需要,则用 0 指定。

【讨论】:

【参考方案2】:

你可以使用

Query query = new Query();

query.fields().include("path");

【讨论】:

【参考方案3】:

你可以使用

public interface PersonRepository extends MongoRepository<Person, String>

  @Query(value=" 'firstname' : ?0 ",fields=" 'firstname' : 1, 'lastname' : 1")
  List<Person> findByThePersonsFirstname(String firstname);


更多信息见spring数据documentation

【讨论】:

如果我想获取所有文档的一些字段,我需要设置 value = "" ,如果我没有设置值,它将检查方法的名称。但我没有检查在这种情况下(不设置值)它是否会处理注释中的字段 @Nikhil Kumar K - 如果我们可以找出不同的记录,有什么办法吗? @PAA 你能试试 findDistinctByThePersonsFirstname @@Nikhil Kumar K - 方法至少需要方法中的一个参数。我只是想找到所有名字 基于您的这部分答案“fields=" 'firstname' : 1, 'lastname' : 1 ”,'1' 数字是什么意思?你能解释一下吗?【参考方案4】:

MongoDB 只为标准查询返回 JSON 文档。您希望看到的内容仍然可以通过返回List&lt;Foo&gt; 来实现。 @Query 中的 fields 属性将导致仅返回设置为 1 的字段。

@Query(value=" path : ?0", fields=" path : 0 ")
List<Foo> findByPath(String path);

我们通常建议为此引入一个专用的 DTO,以防止将部分填充的 Foo 实例依次交给 save(…)

另一种选择是使用聚合框架,但涉及更多。

【讨论】:

Oliver,为每个选择查询创建一个 DTO 是不可行的,因为我们运行大量查询来选择数据子集。在我们不想映射到 DTO 的情况下,Spring Data JPA 返回 List。与此类似,是否有任何 API 可以返回值的 MAp 而不是映射到 DTO?

以上是关于如何仅返回 Spring Data MongoDB 中查询的特定字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Data MongoDB 通过 GridFS ObjectId 获取二进制流

spring-data-mongodb查询结果返回指定字段

Spring Data (数据)MongoDB

如何利用spring data mongodb 进行多条件查询

如何使用 Spring Data Cassandra 仅查询 1 个字段?

JAVA 处理 Spring data mongodb 时区问题