求助:MongoDB Spring Data数组字段聚合无返回值及求和方法
解决MongoDB聚合中数组内字段求和的问题
问题根源
你当前的代码没返回预期结果,主要出在两个点上:
- 未展开数组:
$salaries.amount是一个数组集合,直接用sum()的话,MongoDB无法识别并遍历数组内的元素求和,只会把整个数组当作无效值处理。 - 分组逻辑模糊:
Aggregation.group()未指定分组键,默认会尝试将所有匹配文档归为一组,但数组未展开的情况下,数据结构不符合求和要求,自然返回空结果。
正确的聚合流程
要对数组内的amount字段求和,必须先把数组拆分成独立文档,再执行求和操作,具体步骤如下:
- 使用
$unwind:将salaries数组的每个元素拆分为单独的文档,让每个文档都拥有独立的salaries.amount值。 - 使用
$match:过滤出id为"20"的目标员工数据。 - 使用
$group:按员工id(或全局分组,因为已限定单个员工)进行分组,对拆分后的amount字段求和。
Java代码实现
按员工ID分组的版本(适合批量查询场景)
Aggregation agg = Aggregation.newAggregation( // 拆分salaries数组,每个元素生成独立文档 Aggregation.unwind("salaries"), // 过滤目标员工 Aggregation.match(new Criteria("id").is("20")), // 按id分组,对amount求和 Aggregation.group("id").sum("salaries.amount").as("totalValue") );
全局分组版本(仅针对单个员工查询)
如果确定只查询这一个员工,也可以省略分组键,直接全局求和:
Aggregation agg = Aggregation.newAggregation( Aggregation.unwind("salaries"), Aggregation.match(new Criteria("id").is("20")), Aggregation.group().sum("salaries.amount").as("value") );
逻辑验证
执行这个聚合后,原文档的salaries数组会被拆分成3个独立文档,每个文档都包含id:20和对应的amount值,最终求和结果就是150+30+60=240,符合预期需求。
内容的提问来源于stack exchange,提问作者larnouch
相关产品推荐
相关产品推荐

