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

Cách truy vấn MongoDB datetime nhỏ hơn NOW (hiện tại)

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ĩaVí dụ
$ltNhỏ hơn (strictly less than){ ngay: { $lt: new Date() } }
$lteNhỏ hơn hoặc bằng{ ngay: { $lte: new Date() } }
$gtLớn hơn{ ngay: { $gt: new Date() } }
$gteLớ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") } });