我应该如何使用 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 时如何建模?

spring-data-mongo - 可选查询参数?

如何使 AuditorAware 与 Spring Data Mongo Reactive 一起使用

使用spring data mongo 多数据源如何切换 使用注解形式 不影响使用 MongoRepository 接口方案。

如何在没有 ObjectId 的情况下将 Mongo 与 Spring Data 一起使用

使用 mongoTemplate 在 spring-data-mongo Java 中进行 Mongo 聚合查询