Spring data mongo - 获取对象数组的总和

Spring data mongo - Get sum of array of object

我有以下文件:

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

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

我该怎么做?我见过很多问题,但有了预测,我只需要一个整数,在本例中为 30。

我该怎么做?

谢谢。

为 PUNIT 编辑 1

这是我试过的代码,但它给了我一个空数组

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

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

            mongoTemplate.aggregate(aggregation,"Iniciativas",String.class);

            AggregationResults<String> aggregationa = mongoTemplate.aggregate(aggregation,"Iniciativas",String.class);

            List<String> results = aggregationa.getMappedResults();

您可以使用聚合管道执行此操作

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

此管道包含三个查询:

  1. 获取具有 non-null 和 non-empty 预算的文档
  2. $unwind基本上打开数组,为每个数组元素创建一个文档。例如如果一个预算文档有 3 个元素,那么它将创建 3 个文档并从每个数组元素填充预算 属性。您可以阅读更多相关信息 here
  3. 使用 $sum 运算符
  4. 对所有预算求和 属性

您可以阅读有关聚合管道的更多信息here

编辑:根据评论,也为 java 添加代码。

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

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

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

你也可以用更内联的方式来做到这一点,但我这样写是为了便于理解。

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