32

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

4

3 回答 3

62

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

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

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

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

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

于 2013-03-27T13:13:39.363 回答
9

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

aggregate([
    {
        '$project': {
            newFieldName: {'$dateToString': {format: '%Y-%m-%d', date: '$yourDateFieldName'}}
        }
    }, {
        '$group': {
            _id: {newFieldName: '$newFieldName'},
            viewCount: {'$sum': 1}
        }
    }, 
    {'$sort': {'_id.newFieldName': 1}}
], {})
于 2017-04-23T08:32:22.577 回答
5

由于 mongo 2.6 有$dateToString函数可以这样使用aggregate

db.errors.aggregate([   
 {
   $group : {
    _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" }},
    count: { $sum: 1 }
   }
 }
]);
于 2020-06-05T11:26:04.693 回答