So sánh nhiều trường ngày để tìm giá trị nhỏ nhất
Sử dụng $min trong $project aggregation với mảng các trường, kết hợp $ifNull xử lý trường thiếu.
Dữ liệu 3 trường ngày
> db.demo353.insertOne({
"Date1": new ISODate("2019-01-10"),
"Date2": new ISODate("2016-01-21"),
"Date3": new ISODate("2020-04-11")
});
> db.demo353.insertOne({
"Date1": new ISODate("2011-11-20"),
"Date2": new ISODate("2013-12-10"),
"Date3": new ISODate("2014-01-05")
});
Pipeline tìm ngày cũ nhất
> db.demo353.aggregate([
{
$project: {
OldestDate: {
$min: [
{ $ifNull: ["$Date1", new Date()] },
{ $ifNull: ["$Date2", new Date()] },
{ $ifNull: ["$Date3", new Date()] }
]
}
}
}
]);
Kết quả
{ "_id": ObjectId("..."), "OldestDate": ISODate("2016-01-21T00:00:00Z") }
{ "_id": ObjectId("..."), "OldestDate": ISODate("2011-11-20T00:00:00Z") }
Giải thích:
$ifNull: ["$Date1", new Date()]: Nếu Date1 null/missing, dùng ngày hiện tại (giá trị lớn, không ảnh hưởng min)$minnhận mảng biểu thức, trả về giá trị nhỏ nhất- Kết quả là ISODate object, có thể format thêm với
$dateToString