如何在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;
…
}
7条答案
按热度按时间uqxowvwt1#
MongoDB只为标准查询返回JSON文档。您希望看到的结果仍然可以通过返回
List<Foo>
来实现。@Query
中的fields
属性将导致仅返回设置为1的字段。我们通常建议为此引入专用DTO,以防止将部分填满的
Foo
示例轮流交给save(…)
。另一种选择是使用聚集框架,但这更加复杂。
j2qf4p5b2#
您可以使用
jdgnovmf3#
您可以使用
有关更多信息,请参阅Spring Data 文档
vfhzx4xs4#
您可以使用下面的查询来获取特定的字段。
数据库中存在的记录
如果路径=路径3,则下面的查询将返回foo对象
我们需要使用fieldName:1指定必填字段,如果不需要,则使用0指定它。
z5btuh9x5#
在尝试从集合中的特定对象获取字段的值时,我发现了这个问题。根据我的研究,Mongo没有提供从对象返回特定字段的值的本机方法。(令人失望,因为它似乎非常基本,能够像我在SQL或JSONPath中那样从字段中返回特定值)。
为了解决这个问题,我使用Spring MongoDB和Java 11编写了以下方法:
getEmbedded
调用允许我们获取返回的bson文档中嵌套字段的值。要使用该方法,只需按如下方式调用它:
希望这能帮助其他正在寻找如何做到这一点的人。
顺便说一句,我不确定如何扩展它以返回对象列表--如果我遇到了这个难题并解决了它,我会尝试更新这个答案。我也不确定这是否比运行Mongo聚合查询慢-我还没有尝试对这两种方法进行任何性能比较。
编辑2022-09-30:要返回定制POJO的列表,看起来您必须通过Spring-Data-MongoDB使用聚合查询。此外,基本查询似乎比聚合查询更快,因此在可能的情况下使用基本查询。
n53p2ov06#
您可以使用@Query注解直接传递您的json查询,例如:
下面是指向Spring data MongoDB-https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongodb.repositories.queries.json-based中所有基于JSON的查询的链接
fkvaft9z7#
您可以执行以下操作。
在您的存储库中,您拥有以下方法:
如果文档如下所示(如下所示),并且您只想返回路径
然后创建一个投影界面,例如
您可以使用getter方法从foo获取您感兴趣的字段。
然后,在您的GET请求中,您必须指定项目名称。例如,使用(@资源路径)
然后,您可以(在GET请求中)说:
..../findByPath?path=target_path&projection=flattenedFoo
然后,这将返回一个只包含在FlattenedFoo接口中指定的字段的json。