Java mongo 根据年月日 进行日期分组统计

根据年月日分组统计:

如果mongo存储时间格式为date类型,则可根据指定时间格式进行分组统计返回,如存储时间为string类型,则使用mongodb的substr切割函数进行切割日期,按照年月日进行分组统计返回 

    private List<Document> getReportApi(String collectionName, String type, String 
                                        subStrExpress, String startTime, String endTime) {
        String subStrExpress = "substr(createTime, 0, 4)";
        if ("M".equals(cycle)) {//周期,判断按照年,月,日分组
            subStrExpress = "substr(createTime, 0, 7)";
        } else if ("D".equals(cycle)) {
            subStrExpress = "substr(createTime, 0, 10)";
        }
        Criteria criteria = new Criteria();
        //过滤条件
        if (StringUtils.isNoneBlank(type)) {
            criteria.and("type").is(type);
        }
        //筛选时间范围
        if (StringUtils.isNoneBlank(startTime) && StringUtils.isNoneBlank(endTime)) {
            startTime = startTime + " 00:00:00";
            endTime = endTime + " 23:59:59";
            criteria.and("createTime").gte(startTime).lte(endTime);
        }
        Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.match(criteria),
        //存储时间格式为date类型,mongoFormat为时间格式 %Y-%m            
       //Aggregation.project("createTime").
       //and(DateOperators.DateToString.dateOf("createTime")
       //.toString(mongoFormat)).as("date"),
       //存储时间格式为string类型
        Aggregation.project().andExpression(subStrExpress).as("date"),
        ggregation.group("date").count().as("count"),
        //格式化输出为:date,count--原(_id, count)
        Aggregation.project("date", "count").and("date").previousOperation(),
        //排序
        Aggregation.sort(Sort.Direction.ASC, "date")
        );
        AggregationResults<Document> result = mongoTemplate.aggregate(aggregation, 
        collectionName, Document.class);
        List<Document> documents = result.getMappedResults();
        return documents;
    }

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值