Giới thiệu
Để tìm các tài liệu có trường ngày giờ (datetime) nhỏ hơn hoặc bằng thời điểm hiện tại (NOW), bạn sử dụng toán tử $lte (less than or equal) kết hợp với new Date().
Cú pháp
db.collection.find({
truongNgay: { $lte: new Date() }
});
Ví dụ minh họa
1. Tạo collection với ArrivalDate (ngày đến)
> db.ngayNhoHonNow.insertOne({
"TenKhachHang": "Larry",
"TenSanPham": "Product-1",
"NgayDen": new ISODate("2017-01-31")
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ca1e8ab66324ffac2a7dc59") }
> db.ngayNhoHonNow.insertOne({
"TenKhachHang": "Mike",
"TenSanPham": "Product-2",
"NgayDen": new ISODate("2019-04-01")
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ca1e8c166324ffac2a7dc5a") }
> db.ngayNhoHonNow.insertOne({
"TenKhachHang": "Chris",
"TenSanPham": "Product-3",
"NgayDen": new ISODate("2019-03-31")
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ca1e8d266324ffac2a7dc5b") }
> db.ngayNhoHonNow.insertOne({
"TenKhachHang": "Robert",
"TenSanPham": "Product-4",
"NgayDen": new ISODate("2019-04-02")
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ca1e8e766324ffac2a7dc5c") }
2. Giả sử thời điểm hiện tại (NOW) là 2019-04-02
3. Query: ArrivalDate ≤ NOW
> db.ngayNhoHonNow.find({ NgayDen: { $lte: new Date() } }).pretty();
4. Kết quả - 3 tài liệu (Product-4 ngày 2019-04-02 KHÔNG được lấy vì bằng NOW? Tùy giờ chính xác)
Kết quả ví dụ (NOW = 2019-04-02 00:00:00 UTC):
{ "_id" : ObjectId("5ca1e8ab66324ffac2a7dc59"), "TenKhachHang" : "Larry", "TenSanPham" : "Product-1", "NgayDen" : ISODate("2017-01-31T00:00:00Z") }
{ "_id" : ObjectId("5ca1e8c166324ffac2a7dc5a"), "TenKhachHang" : "Mike", "TenSanPham" : "Product-2", "NgayDen" : ISODate("2019-04-01T00:00:00Z") }
{ "_id" : ObjectId("5ca1e8d266324ffac2a7dc5b"), "TenKhachHang" : "Chris", "TenSanPham" : "Product-3", "NgayDen" : ISODate("2019-03-31T00:00:00Z") }
Các toán tử so sánh ngày tháng
| Toán tử | Ý nghĩa | Ví dụ |
|---|---|---|
$lt | Nhỏ hơn (strictly less than) | { ngay: { $lt: new Date() } } |
$lte | Nhỏ hơn hoặc bằng | { ngay: { $lte: new Date() } } |
$gt | Lớn hơn | { ngay: { $gt: new Date() } } |
$gte | Lớn hơn hoặc bằng | { ngay: { $gte: new Date() } } |
Query khoảng thời gian (Range query)
// Trong 7 ngày qua
db.collection.find({
ngayTao: {
$gte: new Date(Date.now() - 7*24*60*60*1000),
$lte: new Date()
}
});
// Tháng hiện tại
db.collection.find({
ngayTao: {
$gte: new Date(new Date().getFullYear(), new Date().getMonth(), 1),
$lt: new Date(new Date().getFullYear(), new Date().getMonth() + 1, 1)
}
});
Trong Aggregation
db.collection.aggregate([
{ $match: { ngayTao: { $lte: new Date() } } },
{ $group: { _id: null, tongSo: { $sum: 1 } } }
]);
Lưu ý quan trọng
new Date()trong mongo shell trả về **ISODate UTC hiện tại**- MongoDB lưu Date ở **UTC**. So sánh diễn ra ở UTC
- Nếu app dùng múi giờ local, hãy chuyển đổi trước khi query
- Index trên trường Date giúp query range rất nhanh
ISODate()vànew Date()trong shell tương đương
Best Practice: Sử dụng ISODate string trong query tĩnh
// Thay vì new Date() (đổi liên tục), dùng fixed timestamp cho test/report
db.collection.find({ ngayTao: { $lte: ISODate("2019-04-02T00:00:00Z") } });