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

Đếm người dùng đăng nhập trong khoảng thời gian cụ thể trong MongoDB

Để đếm số lượng người dùng đăng nhập trong một khoảng thời gian, MongoDB sử dụng toán tử $gte (greater than or equal) và $lt (less than) trên trường ngày tháng kiểu Date, kết hợp với phương thức count() hoặc countDocuments().

Tạo dữ liệu mẫu

> 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") }

Xem dữ liệu

> db.findDataByDateDemo.find();

Đếm user đăng nhập từ 2019-05-02 đến trước 2019-05-18

> db.findDataByDateDemo.count({"UserLoginDate":{ "$gte": new Date("2019-05-02"), "$lt": new Date("2019-05-18") }});

Kết quả

2

Giải thích

  • $gte: new Date("2019-05-02"): Ngày đăng nhập >= 2019-05-02 00:00:00
  • $lt: new Date("2019-05-18"): Ngày đăng nhập < 2019-05-18 00:00:00 (tức là <= 2019-05-17 23:59:59)
  • Khớp: Sam (05-02), David (05-16) → Tổng 2 người
  • John, Larry (quá sớm), Carol (quá muộn) không khớp

Các phương thức đếm

Phương thứcMô tảKhuyến nghị
count()Deprecated từ MongoDB 4.0Không dùng cho truy vấn có điều kiện
countDocuments()Đếm chính xác với filterKhuyên dùng
estimatedDocumentCount()Ước lượng nhanh (dùng metadata)Chỉ dùng cho đếm toàn collection

Cách hiện đại (MongoDB 4.0+)

db.findDataByDateDemo.countDocuments({
  "UserLoginDate": { 
    "$gte": new Date("2019-05-02"), 
    "$lt": new Date("2019-05-18") 
  }
});

Truy vấn ngày tháng tốt hơn


Tối ưu hóa với Index

db.findDataByDateDemo.createIndex({UserLoginDate: 1});

Mở rộng: Thống kê theo ngày/giờ

db.findDataByDateDemo.aggregate([
  {$match: {UserLoginDate: {$gte: ISODate("2019-05-01"), $lt: ISODate("2019-06-01")}}},
  {$group: {
    _id: {$dateToString: {format: "%Y-%m-%d", date: "$UserLoginDate"}},
    count: {$sum: 1}
  }},
  {$sort: {_id: 1}}
]);