Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Nhóm theo ngày (Group By Date) và đếm trùng lặp trong MongoDB Aggregate

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 _id dùng công thức dayOfYear + 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). $min lấy một ngày đại diện cho nhóm. Cách hiện đại (MongoDB 3.6+): Dùng $dateToString hoặc $dateTrunc (5.0+) đơn giản hơn: _id: { $dateToString: { format: "%Y-%m-%d", date: "$DueDate" } }.