ใช้ Aggregation Framework เพื่อ Group เอกสารตามวันที่ (Date Grouping)
สร้างข้อมูลตัวอย่าง (UserLoginDateTime)
> db.groupByDateDemo.insertOne({"UserLoginDateTime": new ISODate()});
> db.groupByDateDemo.insertOne({"UserLoginDateTime": new ISODate("2019-01-31 15:20:09.234Z")});
> db.groupByDateDemo.insertOne({"UserLoginDateTime": new ISODate("2017-04-21 16:12:13.240Z")});
> db.groupByDateDemo.insertOne({"UserLoginDateTime": new ISODate("2016-05-25 19:11:21.130Z")});
> db.groupByDateDemo.insertOne({"UserLoginDateTime": new ISODate("2016-05-25 19:11:21.130Z")}); // Duplicate date
> db.groupByDateDemo.insertOne({"UserLoginDateTime": new ISODate()});
แสดงเอกสารทั้งหมด
> db.groupByDateDemo.find().pretty();
Aggregation Pipeline: Group By Date (วัน/เดือน/ปี)
> db.groupByDateDemo.aggregate([
{
$group: {
_id: {
$add: [
{$dayOfYear: "$UserLoginDateTime"},
{$multiply: [400, {$year: "$UserLoginDateTime"}]}
]
},
NumberOfTimes: {$sum: 1},
f: {$min: "$UserLoginDateTime"}
}
},
{$sort: {_id: 1}},
{$limit: 10},
{$project: {date: "$f", NumberOfTimes: 1, _id: 0}}
]);
ผลลัพธ์ (จำนวนครั้งต่อวัน)
{ "NumberOfTimes" : 2, "date" : ISODate("2016-05-25T19:11:21.130Z") }
{ "NumberOfTimes" : 1, "date" : ISODate("2017-04-21T16:12:13.240Z") }
{ "NumberOfTimes" : 1, "date" : ISODate("2019-01-31T15:20:09.234Z") }
{ "NumberOfTimes" : 2, "date" : ISODate("2019-02-21T17:50:23.076Z") }
Pipeline: $group คำนวณ Unique Key จาก Year + DayOfYear → $sum นับจำนวน → $min เก็บวันที่แรก → $sort เรียง → $project จัดรูปแบบเอาต์พุต
แนะนำ: MongoDB ใหม่ใช้$dateTrunc(v5.0+) หรือ$groupร่วม$year,$month,$dayOfMonthสำหรับ Group By Date ที่อ่านง่ายกว่า