Spring Data Mongo-获取对象数组的总和

时间:2019-05-30 10:58:37

标签: spring mongodb spring-boot aggregation

我有以下文件:

{
   budgets: [
       {
           amount: 10
       },
       {   
           amount: 20
       }
    ]
}

,我需要对amount中每个对象的budgets字段求和。但是budget对象也可能不存在,所以我需要检查一下。

我该怎么做?我已经看到了很多问题,但是有了预测,我只需要一个整数,在这种情况下,它将是30。

我该怎么办?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用聚合管道完成此操作

db.COLLECTION_NAME.aggregate([
  {budgets:{$exists:true,$not:{$size:0}}},
  {$unwind:"$budgets"},
  {amount:{$sum:"$budgets"}}
]);

此管道包含三个查询:

  1. 获取预算为非空且非空的文档
  2. $unwind基本打开数组,并为每个数组元素创建一个文档。例如如果一个预算文件包含3个元素,则它将创建3个文件并从每个数组元素中填充预算属性。您可以详细了解here
  3. 使用$sum运算符
  4. 对所有预算属性求和

您可以阅读有关聚合管道here

的更多信息

编辑:根据注释,还为Java添加代码。

AggregationOperation filter = match(Criteria.where("budgets").exists(true).not().size(0));
AggregationOperation unwind = unwind("budgets");
AggregationOperation sum = group().sum("budgets").as("amount");

Aggregation aggregation = newAggregation(filter, unwind, sum);

mongoTemplate.aggregate(aggregation,COLLECTION_NAME,Output.class);

您也可以采用更多内联的方式来执行此操作,但是我这样写是为了使它易于理解。

我希望这能回答您的问题。