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
相关产品推荐
相关产品推荐

