文档章节

Mongodb aggregate timezone 问题

飓风2000
 飓风2000
发布于 2017/08/10 20:52
字数 512
阅读 6
收藏 0
点赞 0
评论 0

在用aggregate 进行数据统计处理的时候,由于系统默认使用Mongodb的UTC时间,与我们时区差了8小时,会出现结果误差。为了获得正确的结果,在进行

aggregate 处理时需要在原来的基础上做加8小时处理。

测试数据如下

数据记录
下面我们来计算下shop_id 等于57300412且时间大于’2014-04-01T00:02:00Z’ 按天排序的统计结果。shell表达式如下

1

2

3

4

5

6

7

8

9

10

11

12

13

//经过时差处理

db.test.aggregate({$match:{'_id.shop_id':57300412}},

{$group:{

_id:{

year:{$year:{$add:['$_id.date',28800000]}},

month:{$month:{$add:['$_id.date',28800000]}},

day:{$dayOfMonth:{$add:['$_id.date',28800000]}

}},

amount:{$sum:'$value.amount'},

count:{$sum:'$value.count'},

cost:{$sum:'$value.cost'}}},

{$project:{_id:1,count:1,amount:1,cost:1}}

)

1

2

3

4

5

6

7

8

9

10

11

12

13

//没有经过时差处理

db.test.aggregate({$match:{'_id.shop_id':57300412}},

{$group:{

_id:{

year:{$year:'$_id.date'},

month:{$month:'$_id.date'},

day:{$dayOfMonth:'$_id.date'}

},

amount:{$sum:'$value.amount'},

count:{$sum:'$value.count'},

cost:{$sum:'$value.cost'}}},

{$project:{_id:1,count:1,amount:1,cost:1}}

)

对比结果如下

结果差值
注意上图增加时差和未增加时差的结果是不一样的。

说明:

1

2

$dayOfYear:计算日期的该年第几天,返回1366

$add:['$_id.date',28800000]: 时区数据校准,8小时换算成毫秒数为8*60*60*1000 = 28800000.

相应的Java代码片段如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

DBObject match = new BasicDBObject("$match", new BasicDBObject("_id.shop_id", Integer.parseInt(shopAmount.getShopId())).

                append("_id.date", new BasicDBObject("$gte", startDate).append("$lte", endDate)));

 

BasicDBList dbList = new BasicDBList();

dbList.add("$_id.date");

dbList.add(28800000);//解决timezone 8小时时差

 

Map<String, Object> dbObjIdMap = new HashMap<String, Object>();

dbObjIdMap.put("year", new BasicDBObject("$year",new BasicDBObject("$add",dbList)));

dbObjIdMap.put("month", new BasicDBObject("$month",new BasicDBObject("$add",dbList)));

dbObjIdMap.put("dayOfMonth", new BasicDBObject("$dayOfMonth",new BasicDBObject("$add",dbList)));

DBObject groupFields = new BasicDBObject( "_id", new BasicDBObject(dbObjIdMap));

 

groupFields.put("amount", new BasicDBObject("$sum", "$value.amount"));

groupFields.put("count", new BasicDBObject("$sum", "$value.count"));

groupFields.put("cost", new BasicDBObject("$sum", "$value.cost"));

DBObject group = new BasicDBObject("$group", groupFields);

 

DBObject fields = new BasicDBObject("_id", 1);

fields.put("cost", 1);

fields.put("amount", 1);

fields.put("count", 1);

DBObject project = new BasicDBObject("$project", fields );

DBObject sort = new BasicDBObject("$sort", new BasicDBObject("_id", -1));

/* 查看Group结果 */

AggregationOutput output = collection.aggregate(match, group,project,sort); // 执行 aggregation命令

System.out.println(output.getCommandResult());

Collection<Object> c = output.getCommandResult().values();

Object o[] = c.toArray();

BasicDBList resultList = (BasicDBList) o[1];

© 著作权归作者所有

共有 人打赏支持
飓风2000
粉丝 29
博文 218
码字总数 119157
作品 0
浦东
高级程序员
mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、等等)

最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的...

Airship ⋅ 06/01 ⋅ 0

MongoDB 3.0新特性概述

MongoDB 在 2015年3月3日 跳过了 MongoDB 2.8版本,直接在 MongoDB 2.6版本后,发布了MongoDB 3.0版本。 随后在 2015年3月17日 发布了 MongoDB 3.0.1 版本; 在 2015年4月9日发布了 MongoDB ...

xinsir999 ⋅ 05/02 ⋅ 0

waylau/new-star-blog

NewStarBlog NewStarBlog is an open source Java blog platform. NewStarBlog 是开源 Java 博客平台。 Technologies 涉及技术 NewStarBlog covers Spring Framework 5, Spring Boot 2, Thym......

waylau ⋅ 04/26 ⋅ 0

Docker MongoDB 部署

MongoDB 是一款较为常用的NOSQL 数据库,结合 Docker 使用,能实现轻松配置部署、迁移,本文以下为简要介绍如何在 Docker 中部署并使用 MongoDB。下文主要分为几个部分,内容如下: MongoDB ...

speculatecat ⋅ 04/06 ⋅ 0

Spring从MongoDB中下载文件之GridFS

问题 之前提到过以GridFS方式上传问题到MongoDB中:Spring保存文件到MongoDB之GridFS支持。现在需要从Mongodb中读取文件,应该怎么处理类? 解决 Maven 注解mongoDbFactory 获取文件流 Note...

亚林瓜子 ⋅ 06/12 ⋅ 0

NewStarBlog 发布 1.0 版本,国产开源 Java 博客平台

NewStarBlog 是开源 Java 博客平台。 涉及技术 NewStarBlog 使用了 Spring Framework 5, Spring Boot 2, Thymeleaf, Elasticsearch, Spring Data 等技术。 JDK 8 Gradle 4.5.1 Spring Boot 2......

waylau ⋅ 04/26 ⋅ 0

MongoDB一主一丛有用户认证的搭建

准备好两台测试服务器 主 10.0.0.3 从 10.0.0.4 一、两台服务器安装mongodb数据库 第一步:创建好目录 mkdir -p /datamaster/tools/ cd /datamaster/tools/ 第二步:下载完安装包并解压 #下载...

lsy950109 ⋅ 06/06 ⋅ 0

spring-boot-starter-mongodb-pool

在日常工作中,我们通过Spring Data Mongodb来操作Mongodb数据库,在Spring Boot中只需要引入spring-boot-starter-data-mongodb即可。 很多时候我们往往需要操作多个数据库(微服务架构下一个...

尹吉欢 ⋅ 04/22 ⋅ 0

Graylog日志监控集群搭建

场景及日志量 由于公司是物联网场景,设备每10秒都会上报Gps数据,后端猿对每个每个上传数据的处理都加入了日志,加上后端猿用Quartz写了许多无状态的后台服务,每10s跑一次,而且有多个环境...

秦时明月路 ⋅ 05/30 ⋅ 0

CentOS7.X安装mongodb-3.4.2

安装mongodb 下载安装mongodb3.4.x 加入环境变量 创建数据目录 修改配置文件 启动关闭mongodb 开机启动mongodb Mongodb集群(cluster) 修改mongodb.conf 启动mongodb 初始化mongodb,启动副本集...

qq2233466866 ⋅ 06/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 51分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部