Sử dụng $group trong aggregation pipeline để nhóm tài liệu theo ngày (bỏ qua giờ/phút/giây) và đếm tần suất. Kết hợp $dayOfYear và $year để tạo key nhóm duy nhất cho từng ngày.
Dữ liệu mẫu
> db.demo160.insertOne({"DueDate":new ISODate()});
{ "acknowledged" : true, "insertedId" : ObjectId("5e357525fdf09dd6d0853a04") }
> db.demo160.insertOne({"DueDate":new ISODate("2019-01-11")});
{ "acknowledged" : true, "insertedId" : ObjectId("5e357532fdf09dd6d0853a05") }
> db.demo160.insertOne({"DueDate":new ISODate()});
{ "acknowledged" : true, "insertedId" : ObjectId("5e357534fdf09dd6d0853a06") }
> db.demo160.insertOne({"DueDate":new ISODate("2019-01-11")});
{ "acknowledged" : true, "insertedId" : ObjectId("5e357538fdf09dd6d0853a07") }
> db.demo160.insertOne({"DueDate":new ISODate("2020-04-10")});
{ "acknowledged" : true, "insertedId" : ObjectId("5e357542fdf09dd6d0853a08") }
Xem dữ liệu (ISODate có thời gian)
> db.demo160.find();
{ "_id" : ObjectId("5e357525fdf09dd6d0853a04"), "DueDate" : ISODate("2020-02-01T12:55:01.983Z") }
{ "_id" : ObjectId("5e357532fdf09dd6d0853a05"), "DueDate" : ISODate("2019-01-11T00:00:00Z") }
{ "_id" : ObjectId("5e357534fdf09dd6d0853a06"), "DueDate" : ISODate("2020-02-01T12:55:16.787Z") }
{ "_id" : ObjectId("5e357538fdf09dd6d0853a07"), "DueDate" : ISODate("2019-01-11T00:00:00Z") }
{ "_id" : ObjectId("5e357542fdf09dd6d0853a08"), "DueDate" : ISODate("2020-04-10T00:00:00Z") }
Pipeline nhóm theo ngày
> db.demo160.aggregate([
... { $group: {
... _id: { $add: [ { $dayOfYear: "$DueDate"}, { $multiply: [400, {$year: "$DueDate"}] } ] },
... Frequency: { $sum: 1 },
... d: {$min: "$DueDate"}
... }},
... { $sort: {_id: 1} },
... { $limit: 100},
... { $project: { date: "$d", Frequency: 1, _id: 0} }
... ]);
Kết quả
Giải thích: Key nhóm
_iddùng công thứcdayOfYear + 400*yearđể tạo số nguyên duy nhất cho mỗi ngày (tránh trùng ngày năm khác nhau).$minlấy một ngày đại diện cho nhóm. Cách hiện đại (MongoDB 3.6+): Dùng$dateToStringhoặc$dateTrunc(5.0+) đơn giản hơn:_id: { $dateToString: { format: "%Y-%m-%d", date: "$DueDate" } }.