Mongo 中的aggregation 查询——时间问题
2018-11-12 本文已影响1人
MidWong
时间是无限的。
需求
前端需要展示“2018年10月12日” 这样格式的日期,但由于钉钉E应用限制项目大小5M(其实是前端功底不行),所以格式化日期这个操作就放在后端完成吧。
尝试
1、存储时间时用SimpleDateFormat存储为需要的格式
这个方法也太笨了点,完全不可取
2、用Aggregation查询时,andExpression转换格式
看起来容易,做起来坑多。
第一回合:用dayOfMonth、monthOfYear、year获取年月日,拼接,看起来挺简单但发现MongoDB用的ISODate,UTC时间没有时区,与北京时间差了8小时,虽然可以加86060*1000解决,但感觉还是笨。
第二回合:查询到以下expression可以用,做尝试
$dateToString: { format: "%H:%M:%S:%L%z", date: "$date", timezone: "America/New_York"} }
https://docs.mongodb.com/manual/reference/operator/aggregation/dateToString/
当然失败了。第一次嘛,从来都不会一次写对。
查mongotemplate文档,发现是版本问题:
我的springBoot版本1.4,需要2.1以上的mongo依赖,干脆把项目直接升级了。
升级后用上面的代码格式化日期,报错定位于dateToString:timezone,去掉timezone可以格式化日期但不能解决时区问题。
再查文档,发现 timezone是mongo3.6版本加入的,我的mongo是3.4,依照以下连接升级:
https://docs.mongodb.com/manual/release-notes/3.6-upgrade-standalone/
最终搞定!
总结
版本:mongo依赖,2.1以上、mongo数据库3.6以上
关键代码:
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.project(""inDate")
.andExpression("{$dateToString:{format:'%Y年%m月%d日',date:'$inDate',timezone: 'Asia/Shanghai'}}").as("dateToString")
);
//其他查询代码略
补充
用Robo 3T 客户端设置 Local Timezone,可以解决时区问题
image.png
解决了时区问题亦可用dateAsFormattedString()解决
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.project("inDate")
.and("inDate").dateAsFormattedString("%Y年%m月%d日").as("dateToString")
);
感谢Google。