如何在聚合框架中给出完整时间戳的日期聚合?

Bre*_*eak 26 mongodb aggregation-framework

我有一组错误,所以每个错误都带有一个date字段.如何仅在DAY之前汇总/计算/分组错误(即排除当天的时间)?我想,应该应用一些智能投影.

Phi*_*ipp 56

您可以使用以下聚合运算符来执行此操作:

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

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

此示例假定错误文档中的日期字段dateBSON Date类型.MongoDB中还有一个Timestamp类型,但文档明确表示不鼓励使用此类型:

注意:BSON时间戳类型用于内部MongoDB使用.对于大多数情况,在应用程序开发中,您将需要使用BSON日期类型.有关更多信息,请参见日期

  • PS:作为旁注,进一步它可以是`$ sort`-ed由`_id`(也测试过). (3认同)

Ozz*_*ech 6

从 mongo 2.6 开始,有$dateToString函数可以aggregate这样使用:

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


Dmi*_*eev 5

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

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