mongoTemplate聚合统计字段类型为字符串的数据的和,根据时间日期月份进行统计,日期也为字符串且日期字段是年月日,需要根据月进行统计

需要进行统计的数据字段:

 

 

 统计代码:

 

复制代码
package com.form.formdata.controller;

import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.ConvertOperators;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;

import java.util.List;

import static org.springframework.data.mongodb.core.aggregation.Aggregation.match;

/**
 * @ClassName MongoStringSum
 * @Author lpj
 * @Date 2021/12/17 14:37
 **/
@RestController
@RequestMapping("test")
@ApiIgnore
public class MongoStringSum {
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * @Author: lpj
     * @Date: 2021/8/28 20:37
     * mongoDB统计字符串类型的数据和,以月份进行分组统计,且时间为字符串类型
     */
    @GetMapping
    public List<JSONObject> testSum() {
        String tableName = "你要统计的表名";//名称列明
        String name = "name";//名称列明
        String date = "date";//日期列明
        String score = "score";//分值列明
        Aggregation banciAggregation = Aggregation.newAggregation(
                match(Criteria.where(name).is("张三")),//条件筛选,统计名称为**的数据
                //根据日期进行统计,日期为字符串数据,需特殊处理,这里是根据月份进行分组统计,截取日期字符串0-7则就为月份
                Aggregation.project(date).andExpression(date).substring(0, 7).as("times")
                        //因为Mongo不能直接统计字符串求和操作,则对该字段的数据进行类型转换,转换为doubbo进行统计
                        .and(ConvertOperators.Convert.convertValueOf(score).to("int").onErrorReturn(0).onNullReturn(0)).as("class"),
                //根据处理后的时间进行分组,对处理后的要统计的字段数据进行求和
                Aggregation.group("times").sum("class").as("countSum"),
                //从新挑选展示字段
                Aggregation.project("times", "countSum").and("times").previousOperation());
        AggregationResults<JSONObject> banciAggregate = mongoTemplate.aggregate(banciAggregation, tableName, JSONObject.class);
        List<JSONObject> results = banciAggregate.getMappedResults();//统计完成的数据就在该集合中,我们取出即可使用
        return results;
    }
    
}
复制代码

 

 

 

 

 

 

 

统计出的效果:

 

 

 

 

 

 

 

 

posted @   赶星而至  阅读(1246)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示