【问题标题】:How to aggregate by date when a full timestamp is given in aggregation framework?在聚合框架中给出完整时间戳时如何按日期聚合?
【发布时间】:2013-03-27 11:15:09
【问题描述】:

我有一个错误集合,因此每个错误都带有一个date 字段。如何仅按 DAY 聚合/计数/分组错误(即排除一天中的时间)?我想,应该应用一些智能投影。

【问题讨论】:

  • 为了将来参考,定义时间戳和日期之间的差异很重要,时间戳不能与仅日期字段的日期函数一起使用。这只是一个注释,因为当时英语让我无法回答那个问题。
  • @Sammaye:谢谢,问题已解决。

标签: mongodb aggregation-framework


【解决方案1】:

您可以使用以下聚合运算符来做到这一点:

这将为您提供每个日期的错误计数:

db.errors.aggregate(
    { $group : {
        _id: {
            year : { $year : "$date" },        
            month : { $month : "$date" },        
            day : { $dayOfMonth : "$date" },
        },
        count: { $sum: 1 }
    }}
);

此示例假定错误文档中的日期字段为 date 并且类型为 BSON Date。 MongoDB 中还有一个 Timestamp 类型,但 the documentation 明确不鼓励使用这种类型:

注意:BSON Timestamp 类型供 MongoDB 内部使用。对于大多数 情况下,在应用程序开发中,您将希望使用 BSON 日期 类型。有关详细信息,请参阅日期。

【讨论】:

  • 请稍等 - _id 在哪里?是必须的还是(很可能)我在这里遗漏了什么?
  • @BreakPhreak 已修复(我想 - 再说一遍,我现在无法测试)
  • PS:作为旁注,进一步它可以是$sort-ed by _id(也经过测试)。
  • @Philipp - 关于不使用时间戳。这是否意味着我们不应该使用 ObjectId.prototype.getTimestamp() 的结果?
  • @UpTheCreek 我指的是在数据库中存储文档时使用 BSON 时间戳类型作为字段类型。您当然可以在应用程序层上使用 ObjectId.getTimestamp()。但请记住,它是在 ID 十六进制字符串的前 4 个字节中编码的时间,应该(但不是必须)是生成 ObjectId 的时间。这可能对应于文档实际插入数据库的时间,也可能不对应。
【解决方案2】:

您可以使用 $project (aggregation) 将时间戳字段转换为具有特定日期格式的字符串

aggregate([
    {
        '$project': {
            newFieldName: {'$dateToString': {format: '%Y-%m-%d', date: '$yourDateFieldName'}}
        }
    }, {
        '$group': {
            _id: {newFieldName: '$newFieldName'},
            viewCount: {'$sum': 1}
        }
    }, 
    {'$sort': {'_id.newFieldName': 1}}
], {})

【讨论】:

    【解决方案3】:

    由于 mongo 2.6 有 $dateToString 函数,可以像这样在 aggregate 中使用:

    db.errors.aggregate([   
     {
       $group : {
        _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" }},
        count: { $sum: 1 }
       }
     }
    ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 2013-03-09
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2015-03-25
      相关资源
      最近更新 更多