Spring data mongo - получает сумму массива объекта - PullRequest
0 голосов
/ 30 мая 2019

У меня есть следующий документ:

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

и мне нужно суммировать поле amount для каждого объекта в budgets. Но также возможно, что объект 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();

1 Ответ

1 голос
/ 30 мая 2019

Вы можете сделать это с конвейером агрегации

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

Вы также можете сделать это более встроенным способом, но я написал это так, чтобы было легко понять.

Надеюсь, это ответит на ваш вопрос.

...