我的第一篇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中的纪元时间转换为月/年并计算?
我的关键字研究没有给出我可以尝试的任何东西。
我很茫然。我应该输入什么作为我的搜索词? 有人可以给我一些指示吗?
我真的很感激。
由于
布拉德
答案 0 :(得分:0)
仅供记录,您可以使用date aggregation operators将$year
和$month
以及$dayOfMonth
之类的内容解析为聚合框架的分组键,如下所示:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$year": "$start_time" },
"month": { "$month": "$start_time" },
"day": { "$dayOfMonth": "$start_time" }
},
"count": { "$sum": 1 }
}}
])
但是如果您对“纪元时间戳”值感到满意,那么您总是可以将此基本匹配技巧与“日期”对象和“日期数学”一起使用,以生成四舍五入到所需值的纪元时间戳:
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)
的示例中,这等于一天,并且通过模数将值四舍五入到当天。
这为日期聚合运算符提供了另一种方法,可能希望实际接收“timestamp”值。
由于汇总管道的所有输入都将在提交时“序列化”,因此驱动程序支持的任何给定语言的所有有效“数据对象”将最终作为正确的输入值。我们在这里使用“epoch”日期来将集合中存在的日期对象值“转换”为整数。
这取决于您喜欢的输出。有些人更喜欢“整数”形式作为新的“日期”对象的简单转换。有些人对这些单独的现场部件感到满意。