我有以下文件:
{
budgets: [
{
amount: 10
},
{
amount: 20
}
]
}
,我需要对amount
中每个对象的budgets
字段求和。但是budget
对象也可能不存在,所以我需要检查一下。
我该怎么做?我已经看到了很多问题,但是有了预测,我只需要一个整数,在这种情况下,它将是30。
我该怎么办?
谢谢。
答案 0 :(得分:0)
您可以使用聚合管道完成此操作
db.COLLECTION_NAME.aggregate([
{budgets:{$exists:true,$not:{$size:0}}},
{$unwind:"$budgets"},
{amount:{$sum:"$budgets"}}
]);
此管道包含三个查询:
$unwind
基本打开数组,并为每个数组元素创建一个文档。例如如果一个预算文件包含3个元素,则它将创建3个文件并从每个数组元素中填充预算属性。您可以详细了解here $sum
运算符您可以阅读有关聚合管道here
的更多信息编辑:根据注释,还为Java添加代码。
AggregationOperation filter = match(Criteria.where("budgets").exists(true).not().size(0));
AggregationOperation unwind = unwind("budgets");
AggregationOperation sum = group().sum("budgets").as("amount");
Aggregation aggregation = newAggregation(filter, unwind, sum);
mongoTemplate.aggregate(aggregation,COLLECTION_NAME,Output.class);
您也可以采用更多内联的方式来执行此操作,但是我这样写是为了使它易于理解。
我希望这能回答您的问题。