MongoDB是以UTC格式来存储所有时间的,查询的时候也是返回UTC时间,不提供在数据库连接级别的timezone支持,这就带来一个问题:无法使用groupby对日期进行聚合,因为你所在的timezone的日期跟UTC的日期不完全是同一天。

虽然这个功能在社区里面呼声还是比较高的,但是10gen公司至今都没有给出timezone支持的时间表。 https://jira.mongodb.org/browse/SERVER-6310

这样对于想要存储正确时间到mongodb中,有两种套路。

1:存入数据库之前,把datetime转成UTC时间;从数据库读取时(读取的结果并不带timezone信息,因为它肯定是UTC时间),再把UTC时间转成local timezone。  具体参照这里

2:使用驱动本身提供的tz_aware=True来进行半自动转,为什么说是半自动,因为插入的时候datetime必须带有tzinfo信息,它才能帮助你自动转换成UTC,不然就直接存入mongoDB了。查询的时候datetime带了UTC的tzinfo,需要使用astimezone把它转成local timezone。 具体参照这里

对于groupby的问题,到目前还没有好的解决方案,要么把数据全部拉到客户端,然后进行统一转换,再统计。这样代价会比较大,对于大一点数据来说就不太现实。

如果不需要同一数据支持多timezone的话,可以把本地时间直接存入到mongodb中 ;)

纪录一次自己碰到的一个跟groupby相关的具体问题及解决方案。

《背景》

通过各个app server上的td-agent来收集apache的access log,并存入mongoDB中

td-agent用于收集access log的配置

<source>
type tail
path /var/log/httpd/access_log
pos_file /var/log/td-agent/access_log.pos
tag apache.access
format /^(?<host>[^ ]*) \[(?<time>[^\]]*)\] (?<user>[^ ]*) (?<url>[^ ]*) (?<code>[^ ]*) (?<size>[^ ]*) (?<taken>[^ ]*)$/
time_format %d/%b/%Y:%H:%M:%S %z
</source> <match apache.access>
# plugin type
type mongo_timezone # timezone
utcoffset 8 # mongodb db + collection
database apache
collection access # mongodb host + port
host 127.0.0.1
port # interval
flush_interval 10s
</match>

为了使得groupby可以对日期聚合,必须把本地时间直接存入mongoDB,所有的hack就在mongo_timezone这个mongo_timezone  自己定制plugin里面了。(把该定制文件放入/etc/td-agent/plugin/就可以在配置文件里面直接使用)

每一个fluent的event log包含三部分,tag,time,message。这是一个sample

--09T00::+:       apache.access      {"host":"117.136.88.98","user":"","request":"POST /index/ HTTP/1.1","code":"","size":"","taken":""}

根据fluent-plugin-mongo的源代码,这个timestamp形式的time值默认会写入mongoDB,可以在这里定制我需要的值。

--EOF--

MongoDB的timezone问题的更多相关文章

  1. Date, TimeZone, MongoDB, java中date的时区问题

    打印new Date(),Fri Aug 12 13:37:51 CST 2016. 显示Asia/Shanghai的时区,但是date toString 的时区简写却是CST.更坑爹的是,Googl ...

  2. MySQL、MongoDB、Redis数据库Docker镜像制作

    MySQL.MongoDB.Redis数据库Docker镜像制作 在多台主机上进行数据库部署时,如果使用传统的MySQL的交互式的安装方式将会重复很多遍.如果做成镜像,那么我们只需要make once ...

  3. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...

  4. MongoDB的分组统计 group

    mongodb中的分组聚合用$group,而且处理的最大数据量为100M如果超出需要写入到磁盘,使用格式如下: { $group: { _id: <expression>, <fie ...

  5. JAVA 处理 Spring data mongodb 时区问题

    Spring data mongodb 查询出结果的时候会自动 + 8小时,所以我们看起来结果是对的 但是我们查询的时候,并不会自动 + 8小时,需要自己处理 解决方法 1   @JsonFormat ...

  6. nodejs,mongodb不同时区问题

    问题:不同国家,使用不同时区,而服务器代码却在国内,跨时区日期不同,根据日期查询,查询不到数据了 1.mongodb存储的new Date()是UTC时间,也就是0时区的时间,世界标准时间 2.参考m ...

  7. MongoDB\BSON\UTCDateTime::toDateTime

    示例# 1 MongoDB \ BSON \ UTCDatetime:toDateTime()例子 <?php $utcdatetime = new MongoDB\BSON\UTCDateTi ...

  8. mongodb备份策略

    概述 数据库的备份非常非常非常重要!!!否则出问题连哭的机会有没有(欲哭无泪)今天主要是做一个mongodb的数据库备份. 1.关于备份 备份其实很简单,这里选择的是对mongodb中的某个库进行全备 ...

  9. 关于MongoDB时区问题

    由于MongoDb存储时间按照UTC时间存储的,其官方驱动MongoDB.driver存储时间的时候将本地时间转换为了utc时间,但它有个蛋疼的bug,读取的时候非常蛋疼的是返回的是utc使时间.一个 ...

随机推荐

  1. oracle数据库表空间及归档

    --表空间(TableSpace)是Oracle的开创性理念.表空间使得数据库管理更加灵活,而且极大地提高了数据库性能. --作用 :1.避免磁盘空间突然耗竭的风险 2.规划数据更灵活 3.提高数据库 ...

  2. Android提供的系统服务之--TelephonyManager(电话管理器)

    Android提供的系统服务之--TelephonyManager(电话管理器) 转载请注明出处--coder-pig TelephonyManager的作用: 用于管理手机通话状态,获取电话信息(设 ...

  3. Lazy Load 图片延迟加载(转)

    jQuery Lazy Load 图片延迟加载来源 基于 jQuery 的图片延迟加载插件,在用户滚动页面到图片之后才进行加载. 对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度. ...

  4. 插件就是生产力——那些不能错过的XCode插件们

    古人云"工欲善其事必先利其器",打造一个强大的开发环境,是立即提升自身战斗力的绝佳途径! 晾一下我的武器库,欢迎大家选用:) 全能搜索家CodePilot 2.0 -------- ...

  5. iOS 开发中你是否遇到这些经验问题(一)

    前言 小伙伴们在开发中难免会遇到问题, 你是如何解决问题的?不妨也分享给大家!如果此文章其中的任何一条问题对大家有帮助,那么它的存在是有意义的! 反正不管怎样遇到问题就要去解决问题, 在解决问题的同时 ...

  6. ORACLE 优化

    本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了 ORACLE数据库的优化调整方案. 关键词 ORACLE数据库 环境 ...

  7. Js 替代

    替代全部:.replace(/#/g,"/") 替代第一个:.replace("#","/")    var regS = new RegE ...

  8. aggregations 详解1(概述)

    aggregation分类 aggregations —— 聚合,提供了一种基于查询条件来对数据进行分桶.计算的方法.有点类似于 SQL 中的 group by 再加一些函数方法的操作. 聚合可以嵌套 ...

  9. hadoop的mapreduce过程

    http://www.cnblogs.com/sharpxiajun/p/3151395.html 下面我从逻辑实体的角度讲解mapreduce运行机制,这些按照时间顺序包括:输入分片(input s ...

  10. iOS开发——图片轮播图+单选选项

    由于公司开发需要,需要滚动每道评测题, 并且一道评测题单项选择,按钮和文字都可点击选中 (单选比多选复杂一点,但是原理差不多) 1.当初任务紧,代码也没有优化,仅供思路参考,先放几张图 2.代码部分 ...