MongoDB的timezone问题
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问题的更多相关文章
- Date, TimeZone, MongoDB, java中date的时区问题
打印new Date(),Fri Aug 12 13:37:51 CST 2016. 显示Asia/Shanghai的时区,但是date toString 的时区简写却是CST.更坑爹的是,Googl ...
- MySQL、MongoDB、Redis数据库Docker镜像制作
MySQL.MongoDB.Redis数据库Docker镜像制作 在多台主机上进行数据库部署时,如果使用传统的MySQL的交互式的安装方式将会重复很多遍.如果做成镜像,那么我们只需要make once ...
- MongoDB学习记录
一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...
- MongoDB的分组统计 group
mongodb中的分组聚合用$group,而且处理的最大数据量为100M如果超出需要写入到磁盘,使用格式如下: { $group: { _id: <expression>, <fie ...
- JAVA 处理 Spring data mongodb 时区问题
Spring data mongodb 查询出结果的时候会自动 + 8小时,所以我们看起来结果是对的 但是我们查询的时候,并不会自动 + 8小时,需要自己处理 解决方法 1 @JsonFormat ...
- nodejs,mongodb不同时区问题
问题:不同国家,使用不同时区,而服务器代码却在国内,跨时区日期不同,根据日期查询,查询不到数据了 1.mongodb存储的new Date()是UTC时间,也就是0时区的时间,世界标准时间 2.参考m ...
- MongoDB\BSON\UTCDateTime::toDateTime
示例# 1 MongoDB \ BSON \ UTCDatetime:toDateTime()例子 <?php $utcdatetime = new MongoDB\BSON\UTCDateTi ...
- mongodb备份策略
概述 数据库的备份非常非常非常重要!!!否则出问题连哭的机会有没有(欲哭无泪)今天主要是做一个mongodb的数据库备份. 1.关于备份 备份其实很简单,这里选择的是对mongodb中的某个库进行全备 ...
- 关于MongoDB时区问题
由于MongoDb存储时间按照UTC时间存储的,其官方驱动MongoDB.driver存储时间的时候将本地时间转换为了utc时间,但它有个蛋疼的bug,读取的时候非常蛋疼的是返回的是utc使时间.一个 ...
随机推荐
- 使用python编写批量卸载android应用的脚本
该脚本的功能是卸载android手机中安装的所有第三方应用,主要是使用adb shell pm.adb uninstall 命令,所以使用的前提是需要配好adb的环境变量,下面上代码: #!/usr/ ...
- unity3D Socket连接C#server出现unity3D编辑器再次启动连接 unity3D编辑器马上卡死
unity3D Socket与C#server第一次连接时通讯正常.客服端段关闭后.unity3D编辑器再次启动连接 unity3D编辑器马上卡死 原因是Socket处于异步状态,而异步线程是不受Un ...
- Linux 学习笔记 基本的bash shell命令
Linux 文件系统 Linux讲文件存储在单个目录结构(虚拟目录)中,虚拟目录包含了安装在PC上的所有存储设备的文件路径. Linux虚拟目录中比较复杂的部分是它如何来协调管理各个存储设备.Linu ...
- 自定义控件(视图)1期笔记02:View的绘制流程
1. 引言: 来自源码的3个方法: (1)public final void measure():测量,用来控制控件的大小,final不建议覆写 (2)public void layout():布局, ...
- 3D Touch的简单使用
6s发布以后新增了一个3D touch功能,我个人觉得这个功能点在某些时候还是挺方便的,比如说微信的扫码功能. 直接长按图标就可以进入这个功能里面,不用再打开app.一层层查找了,比较方便. 其实这个 ...
- C语言结构体赋值2
#include <stdio.h> /** 上一个版本的name是固定大小的,不好,这次换用 *name然后 采用 堆的方式申请内存,起到用到少拿多少的一个方式. */ struct s ...
- linux云计算集群架构学习笔记:workstation 12.0 按装Red Hat Enterprise Linux 7(64位)
安装RHEL7.2 步骤: 1.安装虚拟机,按以下截图安装即可 步骤2: Ret hat 7.2 操作系统安装 rhel7因为许可报错解决
- mapping 详解5(dynamic mapping)
概述 在使用 ES 的时,我们不需要事先定义好映射设置就可以直接向索引中导入文档.ES 可以自动实现每个字段的类型检测,并进行 mapping 设置,这个过程就叫动态映射(dynamic mappin ...
- python2 dir(list)
>>> dir(list) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__del ...
- selendroid项目实战3 selendroid driver初始化失败问题
小米4/LG手机作为测试用机,随着测试时间变长,driver初始化失败率越来越高. 分析: 1.手机原因: 从小米换到LG,刚开始问题确实减少了,但是时间一长,又出现类似问题,提示Connect re ...