美文网首页程序员SpringBoot
Mongo 中的aggregation 查询——时间问题

Mongo 中的aggregation 查询——时间问题

作者: MidWong | 来源:发表于2018-11-12 18:35 被阅读1次

    时间是无限的。

    需求

    前端需要展示“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文档,发现是版本问题:

    menu.saveimg.savepath20181112182120.jpg
    我的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。

    相关文章

      网友评论

      本文标题:Mongo 中的aggregation 查询——时间问题

      本文链接:https://www.haomeiwen.com/subject/tkgcfqtx.html