本文介绍在 spring data mongodb 中通过 `@query` 注解精准投影 `_id` 字段,以轻量方式批量获取文档 id 列表,避免加载冗余字段,提升查询性能。
在实际开发中,经常需要仅获取集合中所有文档的 _id(例如用于批量处理、缓存预热或前端分页标识),而非完整实体对象。MongoDB 原生支持字段投影(projection),Spring Data MongoDB 也提供了简洁的集成方式。
在 MongoRepository 接口中,定义如下方法:
@Repository public interface UserRepository extends MongoRepository{ @Query(value = "{}", fields = "{_id: 1}") List findIds(); }
若你希望直接返回 List
ListuserIds = userRepository.findIds().stream() .map(User::getId) .collect(Collectors.toList());
oDB 将返回完整文档,造成不必要的网络与内存开销;@Query(value = "{color: 'blue'}", fields = "{_id: 1}")
List findBlueUserIds(); 对于纯 ID 列表需求,也可使用聚合管道实现零实体映射:
@Aggregation(pipeline = {
"{ $project: { _id: { $toString: '$_id' } } }",
"{ $group: { _id: null, ids: { $push: '$_id' } } }",
"{ $project: { _id: 0, ids: 1 } }"
})
List但该方式复杂度高,日常推荐优先使用字段投影 + List
总之,合理利用 fields 投影是 MongoDB 查询优化的关键实践之一——小改动,大收益。