Spring Boot查询MongoDB子文档数组指定字段最大值问题求助
问题根因
你的聚合查询结果不符合预期,核心问题有两个:
- 未对
versions数组执行$unwind拆包操作,直接对数组字段做最大值计算时,没有遍历数组内的所有元素,只识别到了首个元素的version值,因此返回了1 group阶段指定的分组字段version不存在于根文档下,该字段属于versions数组的子元素属性,分组逻辑错误
正确聚合查询写法
如果是查询全集合所有文档中versions.version的最大值,需要先拆分数组再聚合计算:
val query = Aggregation.newAggregation( // 将versions数组拆分为独立的单元素文档 Aggregation.unwind("versions"), // 全局分组计算最大值,不需要分组字段时传null即可 Aggregation.group().max("versions.version").as("maximum") ) val groupResults = mongoTemplate.aggregate(query, "你的集合名称", Map::class.java) groupResults.mappedResults.forEach { println(it["maximum"]) // 输出预期结果2 }
注解实现方案
1. @Aggregation 注解(推荐用于聚合场景)
Spring Data MongoDB 3.0及以上版本支持在Repository接口中直接通过@Aggregation注解定义聚合管道:
interface YourEntityRepository : MongoRepository<YourEntity, String> { // 全集合最大version查询 @Aggregation(pipeline = [ "{ \$unwind: '\$versions' }", "{ \$group: { _id: null, maximum: { \$max: '\$versions.version' } } }" ]) fun findGlobalMaxVersion(): Int? // 指定单文档内的最大version查询 @Aggregation(pipeline = [ "{ \$match: { _id: ?0 } }", "{ \$project: { maximum: { \$max: '\$versions.version' }, _id: 0 } }" ]) fun findMaxVersionByDocId(docId: String): Int? }
2. @Query 注解实现
如果仅需要查询单个文档内的最大version,可以直接用@Query配合投影实现:
@Query(value = "{ _id: ?0 }", fields = "{ maximum: { \$max: '\$versions.version' }, _id: 0 }") fun findMaxVersionByDocId(docId: String): Map<String, Int>?
调用后返回的Map中maximum字段即为预期的最大值2。
内容的提问来源于stack exchange,提问作者Chellaiah Kaarthikeyan
相关产品推荐
相关产品推荐

