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

Spring Boot MongoDB Aggregation动态计算多字段平均值报错问题

错误原因

你当前的写法是每遍历一个待计算字段,就往聚合管道中新增一个独立的$group阶段:第一个$group执行完成后,管道内的文档只会保留分组键_id和第一个计算得到的平均值字段,原始文档的其他字段都会被丢弃,后续的$group阶段无法再访问到pm25这类原始字段,因此抛出字段引用不存在的异常。

解决方法

你需要先构造一个单独的分组操作,循环给该分组操作追加所有平均值计算规则,最后再把这一个完整的分组操作加入聚合管道即可,修正后的代码如下:

List<AggregationOperation> aggregationOperations = new ArrayList<>();
// 匹配条件保持不变
aggregationOperations.add(Aggregation.match(
        Criteria.where("space_id").is(space_id)
));
// 初始化单个分组操作,分组键为space_id
GroupOperation groupOp = Aggregation.group("space_id");
for(Variable var : concerns){
    System.out.println(var.getField());
    // 给同一个分组操作追加多个平均值计算项
    groupOp = groupOp.avg(var.getField()).as(var.getAvg());
}
// 将构造完成的分组操作加入聚合管道
aggregationOperations.add(groupOp);

Aggregation aggregation = Aggregation.newAggregation(aggregationOperations);
AggregationResults<HashMap> results = mongoTemplate.aggregate(
        aggregation, "records",HashMap.class);

该写法最终生成的聚合管道中只会存在一个$group阶段,可以同时计算所有指定字段的平均值,符合动态多字段平均聚合的需求。


内容的提问来源于stack exchange,提问作者Nicolás Camacho Plazas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:18:01