【问题标题】:How to construct Date with aggregation framework in MongoDB如何在 MongoDB 中使用聚合框架构造日期
【发布时间】: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


【解决方案1】:

虽然目前无法在聚合管道中构造日期,但您可以只取第一个日期时间(稍后在您的客户端中处理它)。

例如:

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}}
])

【讨论】:

    【解决方案2】:

    作为@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-10-23
    • 2020-04-08
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多