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"}}
]);
此管道包含三个查询:
- 获取具有 non-null 和 non-empty 预算的文档
$unwind
基本上打开数组,为每个数组元素创建一个文档。例如如果一个预算文档有 3 个元素,那么它将创建 3 个文档并从每个数组元素填充预算 属性。您可以阅读更多相关信息 here
- 使用
$sum
运算符 对所有预算求和 属性
您可以阅读有关聚合管道的更多信息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);
你也可以用更内联的方式来做到这一点,但我这样写是为了便于理解。
我希望这能回答你的问题。
我有以下文件:
{
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"}}
]);
此管道包含三个查询:
- 获取具有 non-null 和 non-empty 预算的文档
$unwind
基本上打开数组,为每个数组元素创建一个文档。例如如果一个预算文档有 3 个元素,那么它将创建 3 个文档并从每个数组元素填充预算 属性。您可以阅读更多相关信息 here- 使用
$sum
运算符 对所有预算求和 属性
您可以阅读有关聚合管道的更多信息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);
你也可以用更内联的方式来做到这一点,但我这样写是为了便于理解。
我希望这能回答你的问题。