0

我有简单的 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")

4

2 回答 2

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}}
])
于 2013-05-31T13:50:17.383 回答
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'
  }
} 
])
于 2013-05-31T15:18:22.407 回答