Sping Boot MongoDB默认存储库/模板实现和字段投影

vatpfxk5  于 2023-04-29  发布在  Go
关注(0)|答案(1)|浏览(193)

我刚刚开始使用Spring Data MongoDB,从documentation看起来真的很不错。我有一个关于默认查询实现的问题,这样我就可以知道是否需要编写自己的实现。
假设我有很多Person文档,其中包含大量信息--不仅是个人的“姓名”,还有潜在的兆字节信息,如购买历史记录、旅行日期、数学作业等等。(具体的信息是不相关的--我们只说它是很多额外的字段。)但有时我只想查询Person.name的列表。
看起来Spring Data MongoDB允许我在查询时选择特定的字段,这当然是标准的MongoDB field projection。但是,如果我只是使用MongoTemplate或MongoDB reposory执行一个标准查询,Spring Data MongoDB会自动对MongoDB执行字段投影,只查询构造对象所需的字段吗?或者它会做一个一般的查询,只在数据返回后确定哪些字段是有用的?
例如,假设我有一个这样的DTO Java记录:

  1. record PersonListItem(String name) {}

如果我有一个PersonListItemRepository extends CrudRepository<PersonListItem, String>并调用findAll(),Spring Data MongoDB是否会默认查询文档及其所有字段,或者它是否会主动看到它只需要name并在查询中包含该字段投影,以便MongoDB只发送回构建PersonListItem所需的信息?如果我使用MongoTemplate呢?他们中有没有人主动投射出磁场?或者,如果我希望基于文档字段的子集进行高效的查询和数据传输,我是否需要手动编写这样的查询?

rqmkfv5c

rqmkfv5c1#

MongoRepositoryMongoTemplate都将获取整个文档,然后填充类对象。您必须手动指定投影。对于MongoRepository,可以这样做:

  1. @Query(value="{ 'name' : ?0 }", fields="{ 'name' : 1}")
  2. List<PersonListItem> findByThePersonsName(String name);

请注意,fields参数在此处指定了投影字段。
对于MongoTemplate,应该这样做:

  1. Query query = new Query(Criteria.where("name").is(name));
  2. query.fields().include("name");
  3. List<PersonListItem> john = mongoTemplate.find(query, User.class);

相关问题