บทความนี้สาธิตการใช้ $gte (Greater Than or Equal) และ $lt (Less Than) ร่วมกับ count() เพื่อนับจำนวน User ที่ Login ในช่วงวันที่เฉพาะ
สร้างข้อมูลตัวอย่าง
> db.findDataByDateDemo.insertOne({"UserName":"John","UserLoginDate":new ISODate("2019-01-31")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cdd8cd7bf3115999ed511ed") }
> db.findDataByDateDemo.insertOne({"UserName":"Larry","UserLoginDate":new ISODate("2019-02-01")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cdd8ce7bf3115999ed511ee") }
> db.findDataByDateDemo.insertOne({"UserName":"Sam","UserLoginDate":new ISODate("2019-05-02")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cdd8cf3bf3115999ed511ef") }
> db.findDataByDateDemo.insertOne({"UserName":"David","UserLoginDate":new ISODate("2019-05-16")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cdd8d00bf3115999ed511f0") }
> db.findDataByDateDemo.insertOne({"UserName":"Carol","UserLoginDate":new ISODate("2019-10-19")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cdd8d0ebf3115999ed511f1") }
แสดงข้อมูลทั้งหมด
> db.findDataByDateDemo.find();
{ "_id" : ObjectId("5cdd8cd7bf3115999ed511ed"), "UserName" : "John", "UserLoginDate" : ISODate("2019-01-31T00:00:00Z") }
{ "_id" : ObjectId("5cdd8ce7bf3115999ed511ee"), "UserName" : "Larry", "UserLoginDate" : ISODate("2019-02-01T00:00:00Z") }
{ "_id" : ObjectId("5cdd8cf3bf3115999ed511ef"), "UserName" : "Sam", "UserLoginDate" : ISODate("2019-05-02T00:00:00Z") }
{ "_id" : ObjectId("5cdd8d00bf3115999ed511f0"), "UserName" : "David", "UserLoginDate" : ISODate("2019-05-16T00:00:00Z") }
{ "_id" : ObjectId("5cdd8d0ebf3115999ed511f1"), "UserName" : "Carol", "UserLoginDate" : ISODate("2019-10-19T00:00:00Z") }
นับ User ที่ Login ระหว่าง 2019-05-02 ถึง 2019-05-17 (รวมวันที่เริ่ม ไม่รวมวันที่สิ้นสุด)
> db.findDataByDateDemo.count({
"UserLoginDate": {
"$gte": new Date("2019-05-02"),
"$lt": new Date("2019-05-18")
}
});
ผลลัพธ์
2
(Sam: 2019-05-02, David: 2019-05-16)
คำอธิบาย Logic วันที่
$gte: new Date("2019-05-02")- มากกว่าหรือเท่ากับ 2019-05-02 00:00:00 (รวมวันเริ่ม)$lt: new Date("2019-05-18")- น้อยกว่า 2019-05-18 00:00:00 (ไม่รวมวันสิ้นสุด → ครอบคลุมถึง 2019-05-17 23:59:59)- Pattern นี้ ปลอดภัยกว่า $lte สำหรับช่วงวันที่ เพราะไม่ต้องคำนวณเวลาสิ้นสุดวัน
ตัวอย่างเพิ่มเติม: ดึงรายชื่อ User (ไม่ใช่แค่นับ)
db.findDataByDateDemo.find({
"UserLoginDate": {
$gte: new Date("2019-05-02"),
$lt: new Date("2019-05-18")
}
}, { UserName: 1, UserLoginDate: 1, _id: 0 });
ตัวอย่าง: ใช้ Aggregation เพื่อนับและจัดกลุ่มตามวัน
db.findDataByDateDemo.aggregate([
{ $match: {
UserLoginDate: { $gte: new Date("2019-05-01"), $lt: new Date("2019-06-01") }
}},
{ $group: {
_id: { $dateToString: { format: "%Y-%m-%d", date: "$UserLoginDate" } },
count: { $sum: 1 },
users: { $push: "$UserName" }
}},
{ $sort: { _id: 1 } }
]);
หมายเหตุเกี่ยวกับ count()
ใน MongoDB ใหม่ count() ถูก Deprecated แนะนำใช้ countDocuments() หรือ estimatedDocumentCount() แทน