我应该如何使用 Spring Data MongoDB 计算由另一个分组的字段的总和
Posted
技术标签:
【中文标题】我应该如何使用 Spring Data MongoDB 计算由另一个分组的字段的总和【英文标题】:How should I calculate sum of field grouped by another one using Spring Data MongoDB 【发布时间】:2021-07-03 13:41:57 【问题描述】:我有一个用户集合,看起来像这样-
"post": "teacher",
"salary": 4500
,
"post": "teacher",
"salary": 9000
,
"post": "principal",
"salary": 7000
,
"post": "teacher",
"salary": 4500
我想一起计算所有老师的总工资,校长的工资也一样。所以我想要一些看起来像
"teachers_salary": 18000
"principals_salary": 7000
我想使用聚合,但没有得到想要的输出。如果你们中的任何人都可以帮助我解决这个问题,那将非常有帮助。
【问题讨论】:
您找到问题的答案了吗? 【参考方案1】:这是一个使用 spring-data-mongodb 进行聚合的示例。
假设 PostTotalSalary.class 的结果模型对象:
public class PostTotalSalary
private String post; // "teacher" or "principal"
private Integer totalSalary;
我们将创建一个 GroupOperation 来收集所有具有相同值且键为“post”的文档
GroupOperation groupByPostAndSumSalary = group("post")
.sum("salary")
.as("totalSalary");
我们现在可以使用 spring-data-mongodb 创建一个聚合,然后将结果映射到您的结果模型对象(假设集合名称为“posts”):
Aggregation aggregation = Aggregation.newAggregation(groupByPostAndSumSalary);
AggregationResults<PostTotalSalary> groupResults = mongoTemplate.aggregate(aggregation, "posts", PostTotalSalary.class);
如果您想要一个列表,AggregationResults 有 getMappedResults 方法来执行此操作:
List<PostTotalSalary> mappedResults = groupResults.getMappedResults();
最终的结果是
[
"post" : "teacher",
"totalSalary" : "18000" // the total of all salaries for every "teacher" document
,
"post" : "principal",
"totalSalary" : "7000" // the total of all salaries for every "principal" document
]
【讨论】:
【参考方案2】:在 mongoshell 你可以试试这个
db.collection_name.aggregate([
$group:
_id: "$post",
totalsalary: $sum: "$salary"
] )
https://docs.mongodb.com/manual/reference/operator/aggregation/sum/#mongodb-group-grp.-sum
【讨论】:
以上是关于我应该如何使用 Spring Data MongoDB 计算由另一个分组的字段的总和的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring data mongo 和 Spring data elasticsearch 时如何建模?
如何使 AuditorAware 与 Spring Data Mongo Reactive 一起使用
使用spring data mongo 多数据源如何切换 使用注解形式 不影响使用 MongoRepository 接口方案。