【发布时间】:2013-05-27 05:29:59
【问题描述】:
我有简单的 MongoDB 集合:
> db.installer.find().pretty()
{
"_id" : ObjectId("51a875c83146de1db23d25d4"),
"dt" : ISODate("2013-05-31T10:04:56.567Z"),
"ev" : "screenDisplay_welcome"
}
{
"_id" : ObjectId("51a875c83146de1db23d25d5"),
"dt" : ISODate("2013-05-31T10:04:56.568Z"),
"ev" : "distribution"
}
...
{
"_id" : ObjectId("51a87a4d3146de1e6a8de9e2"),
"dt" : ISODate("2013-05-31T10:24:13.901Z"),
"ev" : "screenDisplay_welcome"
}
'ev' - 一些事件。 'dt' - 此事件的日期时间
我想获取按事件名称和事件日期分组的有关此事件的统计信息:
> db.installer.aggregate([{$group:{_id:{ev:'$ev', dt:{$dayOfYear:'$dt'}}, sum:{$sum:1}}}, {$project:{sum:1, _id:0, name:'$_id.ev', dt:'$_id.dt'}}])
{
"result" : [
{
"sum" : 8,
"name" : "uninstall",
"dt" : 151
},
{
"sum" : 3,
"name" : "screenDisplay_installServices",
"dt" : 151
},
{
"sum" : 558,
"name" : "distribution",
"dt" : 151
},
{
"sum" : 115,
"name" : "screenDisplay_welcome",
"dt" : 151
}
],
"ok" : 1
}
这里我使用 $dayOfYear 命令来减少所有事件的时间。 有什么方法可以在聚合管道中构造我的 Date 对象?
例如"dt" : 151 将是 "dt" : ISODate("2013-05-31T00:00:00.000Z")
【问题讨论】:
-
不,不使用聚合框架,您不能在聚合对象表达式中构造 Date 对象(至少在 2.2 中):-/ 将日期作为字符串而不是日期作为选项,或者可能使用 MapReduce?
-
不要使用 $dayOfYear (当你有超过一年的数据时它不能正常工作)相反,你可以使用我在这里描述的技巧:kamsky.org/1/post/2013/03/… - 基本上只是放弃从 $group 阶段之前的日期算起的小时、分钟、秒和毫秒。
-
@AsyaKamsky 感谢您提供此链接。这就是我要找的东西!
标签: mongodb aggregation-framework