我有简单的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对象吗?
e.g。 “dt”:151 将“dt”:ISODate(“2013-05-31T00:00:00.000Z”)
答案 0 :(得分:2)
虽然目前无法在汇总管道中构建日期,但您可以改为使用第一个日期时间(稍后在客户端处理它)。
例如:
db.installer.aggregate([
{$group:
{
_id:{ev:'$ev', doy:{$dayOfYear:'$dt'} },
sum:{$sum:1},
date:{$first: '$dt'}
},
},
{$project:{sum:1, _id:0, name:'$_id.ev', dt:'$_id.doy', date:1}}
])
答案 1 :(得分:1)
作为@jimoleary解决方案的替代方案,无论如何,如果您在客户端处理它,为什么要开始模糊日期? :)
db.installer.aggregate([
{
$group:
{
_id: { ev: '$ev', doy: { $substr: ['$dt', 0, 10] } },
sum: { $sum: 1 }
}
},
{
$project:
{
sum: 1, _id: 0, name: '$_id.ev', dt: '$_id.doy'
}
}
])