首页 > 解决方案 > Spring data mongo - 获取对象数组的总和

问题描述

我有以下文件:

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

我需要amountbudgets. 但也有可能该budget对象不存在,所以我需要检查一下。

我怎么能这样做?我见过很多问题,但通过预测,我只需要一个整数,在这种情况下为 30。

我该怎么做?

谢谢。

编辑 1 为 PUNIT

这是我尝试过的代码,但它给了我和空的 aray

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();

标签: springmongodbspring-bootaggregation

解决方案


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

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

此管道包含三个查询:

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

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

编辑:根据评论,也为 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);

您也可以以更内联的方式执行此操作,但我这样写是为了便于理解。

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


推荐阅读