Để đế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ả
2Giả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ức | Mô tả | Khuyến nghị |
|---|---|---|
count() | Deprecated từ MongoDB 4.0 | Không dùng cho truy vấn có điều kiện |
countDocuments() | Đếm chính xác với filter | Khuyê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}} ]);