项目场景:
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");
希望可以对大家有帮助!