文档章节

Mongodb aggregate timezone 问题

飓风2000
 飓风2000
发布于 2017/08/10 20:52
字数 512
阅读 6
收藏 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
粉丝 36
博文 310
码字总数 135394
作品 0
浦东
高级程序员
一次MongoDB分页查询导致的OOM问题

OOM描述信息: 根据以上信息,好像是MongoDB查询数据的时候占用内存过大,导致的OOM 导出dump文件并且分析一下使用MAT打开文件后有个 Problem Suspect 1(最有可能导致内存溢出的提示) 点击...

日落北极
09/18
0
0
sql和mongodb基本操作对比

基本概念对比 SQL Terms/Concepts MongoDB Terms/Concepts database database table collection row document or BSON document column field index index table joins embedded documents a......

penngo
2014/03/20
0
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
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
0
djongo:Django和MongoDB连接器

在Django项目中使用MongoDB作为后端数据库,且不改变Django的ORM框架。实现Django用户管理程序对MongoDB数据库中文件的增加和修改。 用法 1.pip install djongo 2.在Django项目下的setting.p...

p柯西
06/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

React 服务器渲染原理解析与实践

网盘下载地址 React 服务器渲染原理解析与实践 本套课程,讲解了React中SSR技术的整个搭建思路及流程,完整的从原理上讲清楚了SSR的概念,重点在于讲解编写SSR框架遇到的各种知识点,以及细节...

qq__2304636824
25分钟前
0
0
sourcetree 离线免注册登录安装教程

Sourcetree是一个优秀的git可视化管理工具,深受开发者喜爱Sourcetree官网,但是在安装时需要谷歌账户登录,需要翻qiang才可以,此一点一直被人们所诟病。今天本教程就为大家提供离线免登陆安...

QQZZFT
53分钟前
1
0
使用 PostgreSQL 解决一个实际的统计分析问题

使用 PostgreSQL 解决一个实际的统计分析问题作者:老农民(刘启华)Email: 46715422@qq.com 之前有个朋友扔给我一个奇葩需求,他们公司之前做了一批问卷调查,全部都是统一格式的excel...

新疆老农民
56分钟前
7
0
TypeScript基础入门之高级类型的映射类型

转发 TypeScript基础入门之高级类型的映射类型 高级类型 映射类型 一个常见的任务是将一个已知的类型每个属性都变为可选的: interface PersonPartial {    name?: string;    age?...

durban
今天
1
0
Dubbo源码分析(6):Dubbo内核实现之基于SPI思想Dubbo内核实现

SPI接口定义 定义了@SPI注解 package com.alibaba.dubbo.common.extension; import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.an......

郑加威
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部