Để tìm các tài liệu có ngày hết hạn (expiration date) trước ngày hiện tại, MongoDB sử dụng toán tử so sánh $lte (less than or equal) kết hợp với new Date() hoặc ISODate().
Tạo dữ liệu mẫu
Giả sử ngày hiện tại là 2019-05-11:
> db.getDocumentsExpiredDemo.insertOne({"ArrivalDate": new ISODate("2019-05-11")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd563b17924bb85b3f4893b") }
> db.getDocumentsExpiredDemo.insertOne({"ArrivalDate": new ISODate("2019-01-01")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd563bf7924bb85b3f4893c") }
> db.getDocumentsExpiredDemo.insertOne({"ArrivalDate": new ISODate("2019-05-10")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd563ca7924bb85b3f4893d") }
> db.getDocumentsExpiredDemo.insertOne({"ArrivalDate": new ISODate("2019-02-01")});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd563e77924bb85b3f4893e") }
Xem tất cả tài liệu
> db.getDocumentsExpiredDemo.find().pretty();
Truy vấn tài liệu hết hạn trước hôm nay
> db.getDocumentsExpiredDemo.find({ "ArrivalDate": { $lte : new Date() } });Kết quả (ngày hiện tại = 2019-05-11)
Giải thích
$lte: Less Than or Equal (nhỏ hơn hoặc bằng)new Date(): Trả về ngày/giờ hiện tại của server MongoDB- Tài liệu 2019-05-11 được bao gồm vì dùng $lte (không phải $lt)
- ISODate được lưu trữ ở UTC, lưu ý múi giờ khi so sánh
Các biến thể thường dùng
| Nhu cầu | Truy vấn |
|---|---|
| Hết hạn trước hôm nay (không tính hôm nay) | {$lt: new Date()} |
| Hết hạn tính cả hôm nay | {$lte: new Date()} |
| Chưa hết hạn (tương lai) | {$gt: new Date()} |
| Khoảng thời gian cụ thể | {$gte: startDate, $lte: endDate} |
Lưu ý quan trọng
- Đảm bảo trường ngày tháng có kiểu Date (ISODate), không phải String
- Tạo index trên trường ngày để tối ưu truy vấn:
db.collection.createIndex({ArrivalDate: 1}) - MongoDB Shell:
new Date()trả về thời gian server; Driver: truyền Date object từ ứng dụng