我刚刚开始使用Spring Data MongoDB,从documentation看起来真的很不错。我有一个关于默认查询实现的问题,这样我就可以知道是否需要编写自己的实现。
假设我有很多Person
文档,其中包含大量信息--不仅是个人的“姓名”,还有潜在的兆字节信息,如购买历史记录、旅行日期、数学作业等等。(具体的信息是不相关的--我们只说它是很多额外的字段。)但有时我只想查询Person.name
的列表。
看起来Spring Data MongoDB允许我在查询时选择特定的字段,这当然是标准的MongoDB field projection。但是,如果我只是使用MongoTemplate
或MongoDB reposory执行一个标准查询,Spring Data MongoDB会自动对MongoDB执行字段投影,只查询构造对象所需的字段吗?或者它会做一个一般的查询,只在数据返回后确定哪些字段是有用的?
例如,假设我有一个这样的DTO Java记录:
record PersonListItem(String name) {}
如果我有一个PersonListItemRepository extends CrudRepository<PersonListItem, String>
并调用findAll()
,Spring Data MongoDB是否会默认查询文档及其所有字段,或者它是否会主动看到它只需要name
并在查询中包含该字段投影,以便MongoDB只发送回构建PersonListItem
所需的信息?如果我使用MongoTemplate
呢?他们中有没有人主动投射出磁场?或者,如果我希望基于文档字段的子集进行高效的查询和数据传输,我是否需要手动编写这样的查询?
1条答案
按热度按时间rqmkfv5c1#
MongoRepository
和MongoTemplate
都将获取整个文档,然后填充类对象。您必须手动指定投影。对于MongoRepository
,可以这样做:请注意,fields参数在此处指定了投影字段。
对于
MongoTemplate
,应该这样做: