spring - Spring data mongo - 获取对象数组的总和
问题描述
我有以下文件:
{
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();
解决方案
您可以使用聚合管道执行此操作
db.COLLECTION_NAME.aggregate([
{"pmv.budgets":{$exists:true,$not:{$size:0}}},
{$unwind:"$pmv.budgets"},
{amount:{$sum:"$pmv.budgets"}}
]);
此管道包含三个查询:
- 获取具有非空和非空预算的文档
$unwind
基本上打开数组并为每个数组元素创建一个文档。例如,如果一个预算文档有 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);
您也可以以更内联的方式执行此操作,但我这样写是为了便于理解。
我希望这能回答你的问题。
推荐阅读
- javascript - 如何一次向 URL 添加多个参数
- go - 有没有一种方法可以以一种不易出错的方式声明我的预加载
- flutter - 如何去除 Flutter 中资产视频底部的绿线?
- java - " 使用带有 null 的 switchCase"
- r - 当列相互依赖时如何计算R数据框中的值
- css - Material UI 5 情感问题
- python - 动态更新 matplotlib 图
- r - 仅在一列上使用 fread 和 grep
- python - 如何从 OpenCV 中的轮廓裁剪内部(不完整)矩形
- javascript - Selenium Javascript:检查元素是否与按对象匹配