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

นับจำนวน User ที่ Login ระหว่างวันที่กำหนดใน MongoDB ($gte, $lt)

บทความนี้สาธิตการใช้ $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() แทน