本文详解如何使用 spring data mongodb 的 mongotemplate 执行多字段分组($group)并结合 $max 聚合操作,提供可直接运行的 java 代码示例、关键语法说明及常见注意事项。
在 Spring Data MongoDB 中,MongoTemplate 提供了类型安全、链式调用的聚合 API,但其语法与原生 MongoDB Shell 存在抽象差异——尤其是 $group 阶段中对嵌套字段引用和多字段分组的支持需特别注意。
✅ 正确实现单字段分组 + max 聚合(对应原始需求)
原始 MongoDB 查询仅按 somefield.$id(即文档中 somefield 对象的 id 字段)分组,并取每组 _id 的最大值。在 MongoTemplate 中,点号(.)表示嵌套路径,无需转义或特殊处理,直接写为 “somefield.id” 即可:
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.group("somefield.id")
.max("_id").as("xyz")
);
⚠️ 注意:”somefield.id” 是字段路径字符串,不是 JSON 或 SpEL 表达式;$max 操作自动作用于 _id 字段(假设其为 ObjectId 或可比较类型),结果将映射到输出文档的 xyz 字段。
✅ 扩展:多字段分组(Group by Multiple Fields)
若需按多个字段联合分组(如 status 和 category),应使用 GroupOperation.groupBy() 配合 Fields.from():