繁体   English   中英

Pentaho Report Designer MongoDB按时代时间戳分组

[英]Pentaho Report Designer MongoDB grouping by epoch timestamps

我的第一个StackOverflow帖子!

我有一个名为user_sessions的MongoDB集合-单个文档如下所示:

{
    "_id" : ObjectId("53e352bbed3e4af00d8b459a"),
    "active_date" : 1407406779727,
    "auth_token" : "WObDF9KO6n1V34lgjlFIoXoiEmOH9CM8",
    "device_token" : "3474ac2d5aa9c7dc933bd4548c2dd6ea3d8a9592dad1c1a807c06ac2c8459205",
    "device_type" : "1",
    "end_time" : "",
    "sessionid" : "",
    "start_time" : 1407406779727,
    "userid" : "53e352bbed3e4af00d8b4599"
}

我正在尝试使用Pentaho的报表设计器(5.1)创建一个报表。 我已经设法通过此查询输出用户会话的总数:

[
      { $group: { _id: null, count: { $sum: 1 } } }
]

太好了

但是,我也想按日期显示会话数。

当我针对该集合运行此PHP脚本时(使用PHP Mongo驱动程序):

$connection = new Mongo("mongodb://$dbhost");
$c_us = $db->user_session;
$cursor = $c_us->find();
foreach ( $cursor as $document ) {
    echo "<br/>UserID: " . $document['userid'] . ", StartTime: ";
    $epoch = $document['start_time'];
    echo date('Y-m-d',$epoch/1000); 
}

我得到以下输出:

UserID: 53dfa1a7ed3e4aef0d8b456b, StartTime: 2014-08-05
UserID: 53e075deed3e4af00d8b4570, StartTime: 2014-08-05
UserID: 53e079c9ed3e4af00d8b4573, StartTime: 2014-08-05
UserID: 53e07f8ded3e4aef0d8b4580, StartTime: 2014-08-05
UserID: 53e081f9ed3e4aef0d8b4583, StartTime: 2014-08-05
UserID: 53e352bbed3e4af00d8b4599, StartTime: 2014-08-07
UserID: 53e9fb9eed3e4af00d8b45a3, StartTime: 2014-08-12
UserID: 53f215f6ed3e4aef0d8b45a3, StartTime: 2014-08-19
UserID: 53f3eeb7ed3e4aef0d8b45a7, StartTime: 2014-08-20
UserID: 54083e94ed3e4af00d8b45b0, StartTime: 2014-09-04
UserID: 5412cd29ed3e4aef0d8b45bc, StartTime: 2014-09-12
UserID: 54175625ed3e4aef0d8b45c0, StartTime: 2014-09-16
UserID: 54351b7ced3e4af00d8b45ff, StartTime: 2014-10-08
UserID: 5444f1dced3e4a56718b45bb, StartTime: 2014-10-20
UserID: 54475d48ed3e4af00d8b4628, StartTime: 2014-10-22
UserID: 5449cc77ed3e4a79638b4592, StartTime: 2014-10-24
UserID: 53e3c875ed3e4af00d8b459d, StartTime: 2014-10-24
UserID: 544f6bb7ed3e4af00d8b464a, StartTime: 2014-10-28
UserID: 544de95aed3e4a56718b45f2, StartTime: 2014-10-31
UserID: 545b125c4a4ddd30048b4567, StartTime: 2014-11-06

太棒了!

但是,如何按日期(和月份/日期)对会话进行计数?

因此,对于上述情况,我需要这样的报告:

2014-08-05    5
2014-08-07    1
.
.
.
2014-10-24    2

等等

Month/Year     Count
Aug 2014       9
Sep 2014       3
Oct 2014       7
Nov 2014       1

给定user_session模式,如何将start_time中的纪元时间转换为月/年并计数?

我的关键字研究也没有给我任何我可以尝试的东西。

我很茫然。 我应该输入什么作为搜索词? 有人可以给我一些指示吗?

我真的很感激。

谢谢

布拉德

仅作记录,您可以使用日期聚合运算符将诸如$year$month$dayOfMonth分解为聚合框架的分组键,如下所示:

db.collection.aggregate([
   { "$group": {
       "_id": {
           "year": { "$year": "$start_time" },
           "month": { "$month": "$start_time" },
           "day": { "$dayOfMonth": "$start_time" }
       },
       "count": { "$sum": 1 }
   }}
])

但是,如果您对“ epoch timestamp”的值感到满意,那么通常可以将这种基本的匹配技巧与“ date”对象和“ date math”一起使用,以产生一个四舍五入的时间戳记,将其舍入为所需的值:

db.collection.aggregate([
    { "$group": {
        "_id": {
            "$subtract": [
                { "$subtract": [ "$start_time", new Date("1970-01-01") ] },
                { "$mod": [
                     { "$subtract": [ "$start_time", new Date("1970-01-01") ] },
                     1000 * 60 * 60 * 24
                ]}
            ]
        },
        "count": { "$sum": 1 }
    }}
)

使用基本技巧时,当您从一个“日期”对象“减去”或执行其他类似的数学运算时,结果是与对象的整数之间的“毫秒差异”。 在给定的示例(1000 * 60 * 60 * 24)这等于一天中的某一天 ,并且通过取模将值四舍五入为当前日期。

这为日期聚合运算符提供了一种替代方法,可能需要实际接收“时间戳”值。

由于提交时将对聚合管道的所有输入进行“序列化”,因此驱动程序支持的任何给定语言的所有有效“ dat对象”都将最终得到正确的输入值。 我们仅在此处使用“时代”日期将集合中存在的日期对象值“转换”为整数。

这取决于您更喜欢作为输出。 有些人更喜欢将“整数”形式转换为新的“日期”对象。 有些人对现场的各个部分感到满意​​。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM