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

Posted

技术标签:

【中文标题】Spring data mongodb - 获取对象数组的总和【英文标题】:Spring data mongo - Get sum of array of object 【发布时间】:2019-10-16 00:46:37 【问题描述】:

我有以下文件:


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

【问题讨论】:

【参考方案1】:

您可以使用聚合管道来做到这一点

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

此管道包含三个查询:

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

你可以阅读更多关于聚合管道here

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

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

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

【讨论】:

我知道它在 Mongo 中的情况,但不知道如何将它翻译成 java 嗨@Wrong,也添加了java代码。如果您需要更多帮助,请告诉我。 我真的很抱歉@PunitTiwan,我忘了提到预算对象在另一个对象中。我已经用你的代码和我尝试过但成功的方法编辑了我的问题。 @Wrong 我认为您将不得不在sum 运算符中使用“pmv.budgets”而不是“budgets”,或者在unwind 中将预计名称命名为“budgets” 我必须将“pmv”放在匹配条件中(它可能不存在,但如果 pmv 存在,预算总是存在),然后是 $budgets 在展开中,然后是“budgets”在总和中。我会接受你的回答,但请为未来的读者修改:)

以上是关于Spring data mongodb - 获取对象数组的总和的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data MongoDB 三:基本文档查询(QueryBasicQuery)

Spring Data (数据)MongoDB

Spring-data MongoDB地理查询

如何利用spring data mongodb 进行多条件查询

使用 Spring Boot 对 mongoDB 进行身份验证失败

@Tailable(spring-data-reactive-mongodb) 等效于 spring-data-r2dbc