如何仅返回 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 中选择特定字段。我尝试了以下方法,但我得到了从Foo
到String
的转换异常。
使用@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<Foo>
来实现。 @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以上是关于如何仅返回 Spring Data MongoDB 中查询的特定字段?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Data MongoDB 通过 GridFS ObjectId 获取二进制流
如何利用spring data mongodb 进行多条件查询