mysql & mongo aggregate

假如我们的APP CRASH数据是这样的:

Create Table: CREATE TABLE `t_crash` (
  `crash_id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'CRASH ID',
  `app_id` varchar(255) NOT NULL COMMENT 'APP ID',
  `app_key` varchar(255) NOT NULL COMMENT 'APP KEY',
  `device_uuid` varchar(255) DEFAULT NULL COMMENT 'DEVICE UUID',
  `device_model` varchar(255) DEFAULT NULL COMMENT '手机型号',
  `app_version` varchar(255) DEFAULT NULL COMMENT 'APP版本',
  `osVersion` varchar(255) DEFAULT NULL COMMENT '操作系统版本',
  `app_channel` varchar(255) DEFAULT NULL COMMENT 'APP渠道号',
  `app_start_time` int(10) DEFAULT NULL COMMENT 'APP启动',
  `app_crash_time` int(10) DEFAULT NULL COMMENT 'CRASH发生时间',
  `crash_exception_type` varchar(255) DEFAULT NULL COMMENT 'crash类别',
  `crash_exception_desc` text COMMENT 'CRASH堆栈',
  `crash_callstack` text COMMENT '完整的错误栈',
  PRIMARY KEY (`crash_id`),
  KEY `ix_device_model` (`device_model`)
) ENGINE=InnoDB AUTO_INCREMENT=34768 DEFAULT CHARSET=utf8 COMMENT='crash日志'

我们看个例子:

*************************** 1. row ***************************
            crash_id: 18768
              app_id: 1
             app_key: 1
         device_uuid: MI3
        device_model: MI3
         app_version: 1.0
           osVersion: Android 2.3.3,level 10
         app_channel: 1
      app_start_time: 1478770730
      app_crash_time: 1478770730
crash_exception_type: A
crash_exception_desc: a
     crash_callstack: NULL

我们用MYSQL来统计:

统计设备TOP5

SELECT COUNT(*) as number,device_model FROM xmapp_crash 
GROUP BY device_model
ORDER BY number desc 

统计CRASH的48小时内每小时的数据

SELECT count(*) as number,DATE_FORMAT(FROM_UNIXTIME(app_crash_time), '%Y-%m-%d %H') as t
FROM xmapp_crash
WHERE app_crash_time>UNIX_TIMESTAMP()-3600*48
GROUP BY DATE_FORMAT(FROM_UNIXTIME(app_crash_time), '%Y-%m-%d %H')
ORDER BY t desc

统计一个月内的数据

SELECT count(*) as number,DATE_FORMAT(FROM_UNIXTIME(app_crash_time), '%Y-%m-%d') as t
FROM xmapp_crash
WHERE app_crash_time>UNIX_TIMESTAMP()-3600*24*30
GROUP BY DATE_FORMAT(FROM_UNIXTIME(app_crash_time), '%Y-%m-%d')
ORDER BY t desc

现在我们把数据导入到mongo:

<?php

$connectionString = 'mysql:host=localhost;port=3306;dbname=mydb';
$username='root';
$password='root';
$db = new PDO($connectionString, $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = 'SELECT * FROM t_crash';
$statement=$db->prepare($sql);
$statement->execute();
$results=$statement->fetchAll(PDO::FETCH_ASSOC);

$m = new MongoClient("mongodb://localhost:27017");
$m_db = $m->test;
foreach($results as $key=>$result) {
    $m_db->app_crash->insert($result);
}

数据查看一下:

db.app_crash.findOne()
{
        "_id" : ObjectId("582af43ca97a17601b52089a"),
        "crash_id" : "18768",
        "app_id" : "1",
        "app_key" : "1",
        "device_uuid" : "MI3",
        "device_model" : "MI3",
        "app_version" : "1.0",
        "osVersion" : "Android 2.3.3,level 10",
        "app_channel" : "1",
        "app_start_time" : "1478770730",
        "app_crash_time" : "1478770730",
        "crash_exception_type" : "A",
        "crash_exception_desc" : "a",
        "crash_callstack" : null
}

我们来做统计:

统计设备TOP5

db.crash.aggregate( [     { $group: { _id: "$device_model", number: { $sum: 1} } },     { $sort: {"number": -1 }} ])

使用mapreduce

db.crash.mapReduce(
    function() { emit( this.app_version, 1) },
    function(key, values) { return Array.sum(values) },
    {
        out: "crash_version"
    }
)

如果使用单独的group功能

db.crash.group({
    key: {device_model: 1},
    reduce: function(curr, result){
        result.total += 1;
    },
    initial: {total : 0}
})

统计CRASH的时间曲线,48小时内每小时

db.crash.mapReduce(
    function() { 
      if(this.app_crash_time*1000 >= (new Date().getTime()-172800)){
        var date = new Date(this.app_crash_time*1000);
        var dateKey = date.getFullYear()+'-' + (date.getMonth()+1)+"-"+date.getDate()+"-"+date.getHours();
        emit( dateKey, 1);
      }
    },
    function(key, values) { return Array.sum(values) },
    {
        out: "crash_version"
    }
)

统计一个月内,机型CRASH的分布

db.crash.mapReduce(
    function() { 
      if(this.app_crash_time*1000 >= (new Date().getTime()-2592000)){
        var date = new Date(this.app_crash_time*1000);
        var dateKey = date.getFullYear()+'-' + (date.getMonth()+1)+"-"+date.getDate();
        emit( dateKey, 1);
      }
    },
    function(key, values) { return Array.sum(values) },
    {
        out: "crash_version"
    }
)

微信公众账号:myersguo
(完)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容