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

ric*_*oon 17 java spring mongodb spring-data spring-data-mongodb

我们如何在Spring Data Mongo中选择特定字段.我尝试以下,但我从投例外FooString.

运用 @Query

@Query(value="{path : ?0}", fields="{path : 0}")
String findPathByPath(String path);
Run Code Online (Sandbox Code Playgroud)

@Query

String findPathByPath(String path);
Run Code Online (Sandbox Code Playgroud)

这是文档模型

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

  String name, path;
  …
}
Run Code Online (Sandbox Code Playgroud)

Oli*_*ohm 22

MongoDB仅返回标准查询的JSON文档.你想看到的东西可以通过仍然返回来实现List<Foo>.该fields属性@Query将仅返回设置为1的字段.

@Query(value="{ path : ?0}", fields="{ path : 0 }")
List<Foo> findByPath(String path);
Run Code Online (Sandbox Code Playgroud)

我们通常建议为此引入专用的DTO,以防止部分填充的Foo实例save(…)依次被传递.

另一个选择是使用聚合框架,但更复杂.

  • Oliver,为每个选择查询创建DTO是不可行的,因为我们运行大量查询来选择子数据集.在我们不想映射到DTO的情况下,Spring Data JPA返回List <Object []>.Similalr,那有没有API可以返回值的MAp而不是映射到DTO? (2认同)

小智 14

您可以使用

Query query = new Query();

query.fields().include("path");
Run Code Online (Sandbox Code Playgroud)


小智 14

您可以使用

public interface PersonRepository extends MongoRepository<Person, String>

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

}
Run Code Online (Sandbox Code Playgroud)

有关spring数据文档的更多信息


小智 6

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

@Query(fields="{path : 1}")
Foo findPathByPath(String path);
Run Code Online (Sandbox Code Playgroud)

数据库中存在的记录

{
    "name" : "name2",
    "path" : "path2"
},
{
    "name" : "name3",
    "path" : "path3"
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "name": null,
    "path": "path3"
}
Run Code Online (Sandbox Code Playgroud)

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