You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:42:03