java MongoDB DateToString按时间分组查询

项目场景:

mongodb中的数据按时间进行分组统计,mongodb中时间存储的是秒级时间戳格式


问题描述

最开始查阅博客, 想用project().andExpression()的方式将mongodb语句的dateToString直接放入

ProjectionOperation projectionOperation1 = project().andExpression("{
                "$dateToString": {
                    "format": "%Y-%m-%d", //按天查询
                    "timezone": "Asia/Shanghai", //上海时区
                    "date": {
                         "$convert":{ //时间戳转日期
                              //因为存储的是秒级时间戳要*1000转换为毫秒
                               'input' : {'$multiply': ['$created_at', 1000] },
                                 //要转换为的类型  
                                 "to": "date"
                           }
                    }
                }
            }").as("date");
GroupOperation groupOperation = Aggregation.group("date").count().as("totalCount");
TypedAggregation<Machine> typedAggregation = Aggregation.newAggregation(Machine.class, 
                   matchOperation,projectionOperation1, groupOperation);
AggregationResults<Map> onlyMachineCountResults = mongoTemplate.aggregate(typedAggregation, 
                          Map.class);
 

原因分析:

project().andExpression() 无法解析成完整的mongodb语句 查阅资料发现是andExpression会过滤掉$


解决方案:

使用springframework.data.mongodb中提供的方法解决问题

找到multiply,convert,dateToString 对应的方法解决问题

​//{'$multiply': ['$created_at', 1000] }
ArithmeticOperators.Multiply multiply = 
                      ArithmeticOperators.Multiply.valueOf("createdTime").multiplyBy(1000);
//"$convert"
ConvertOperators.Convert date = ConvertOperators.Convert.convertValue(multiply).to("date");
        DateOperators.DateToString dateToString = 
//"$dateToString": {"format": "%Y-%m-%d" "timezone": "Asia/Shanghai",}
DateOperators.DateToString.dateOf(date).toString(format).withTimezone(DateOperators.Timezone.valueOf("Asia/Shanghai"));
ProjectionOperation projectionOperation1 = project().and(dateToString).as("date");
GroupOperation groupOperation = Aggregation.group("date").count().as("totalCount");

​

希望可以对大家有帮助!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值