web-dev-qa-db-ja.com

集計フレームワークで完全なタイムスタンプが指定されている場合、日付ごとに集計する方法は?

エラーのコレクションがあるので、すべてのエラーにはdateフィールドが含まれます。エラーを日ごとに集計/カウント/グループ化するにはどうすればよいですか(つまり、時刻を除外しますか)?いくつかのスマートな投影法を適用する必要があると思います。

26
BreakPhreak

これを行うには、次の集計演算子を使用します。

これにより、各日付のエラーカウントが得られます。

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

この例では、エラードキュメントの日付フィールドがdateで、タイプが BSON Date であると想定しています。 MongoDBにはTimestamp型もありますが、この型の使用は ドキュメント によって明示的に推奨されていません。

注:BSON Timestampタイプは、MongoDBの内部使用向けです。ほとんどの場合、アプリケーション開発では、BSON日付タイプを使用します。詳細については、日付を参照してください。

54
Philipp

$ project(aggregation) を使用して、タイムスタンプフィールドを特定の日付形式の文字列に変換できます。

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