Lọc tài liệu theo định dạng ngày với $dateToString
Để lọc tài liệu dựa trên định dạng ngày cụ thể (ví dụ: YYYY-MM-DD), sử dụng $dateToString trong aggregation pipeline.
1. Tạo collection với dữ liệu ngày
> db.demo433.insertOne({ "DueDate": new Date("2019-11-23") });
{ "acknowledged": true, "insertedId": ObjectId("5e771278bbc41e36cc3cae91") }
> db.demo433.insertOne({ "DueDate": new Date("2020-01-03") });
{ "acknowledged": true, "insertedId": ObjectId("5e771290bbc41e36cc3cae92") }
2. Xem dữ liệu gốc (ISODate)
> db.demo433.find();
Kết quả:
{ "_id": ObjectId("5e771278bbc41e36cc3cae91"), "DueDate": ISODate("2019-11-23T00:00:00Z") }
{ "_id": ObjectId("5e771290bbc41e36cc3cae92"), "DueDate": ISODate("2020-01-03T00:00:00Z") }
3. Truy vấn lọc theo ngày 2020-01-03
> db.demo433.aggregate([
{
$addFields: {
stringDate: {
$dateToString: { format: "%Y-%m-%d", date: "$DueDate" }
}
}
},
{ $match: { "stringDate": "2020-01-03" } },
{ $project: { "stringDate": 0 } }
])
4. Kết quả
{ "_id": ObjectId("5e771290bbc41e36cc3cae92"), "DueDate": ISODate("2020-01-03T00:00:00Z") }
Các định dạng ngày thường dùng
| Format | Kết quả ví dụ |
|---|---|
| %Y-%m-%d | 2020-01-03 |
| %d/%m/%Y | 03/01/2020 |
| %H:%M:%S | 14:30:00 |
| %Y-%m-%d %H:%M | 2020-01-03 14:30 |
Lưu ý: Cách này chuyển đổi ngày thành chuỗi để so sánh. Với dữ liệu lớn, hãy cân nhắc tạo index trên trường ngày gốc và dùng toán tử so sánh ngày trực tiếp ($gte, $lte) để hiệu suất tốt hơn.