Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

Group By Date ใน MongoDB ด้วย Aggregation

ใช้ 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 ที่อ่านง่ายกว่า