Tính khoảng thời gian và sắp xếp tìm max với aggregation
Sử dụng $toDate, $subtract, $sort, $limit để tìm document có khoảng thời gian (endDate - startDate) lớn nhất.
Dữ liệu thời gian
> db.demo344.insertOne({"startDate": "2020-02-24 10:50:00", "endDate": "2020-02-24 11:50:00"});
> db.demo344.insertOne({"startDate": "2020-02-24 08:00:00", "endDate": "2020-02-24 11:50:50"});
Pipeline tìm khoảng thời gian dài nhất
> db.demo344.aggregate([
{
$addFields: {
longestTime: {
$subtract: [
{ $toDate: "$endDate" },
{ $toDate: "$startDate" }
]
}
}
},
{ $sort: { longestTime: -1 } },
{ $limit: 1 }
]);
Kết quả
{
"_id": ObjectId("..."),
"startDate": "2020-02-24 08:00:00",
"endDate": "2020-02-24 11:50:50",
"longestTime": NumberLong(13850000) // milliseconds
}
Giải thích: $toDate chuyển string sang Date (ISODate). $subtract trả về milliseconds. $sort: -1 giảm dần, $limit: 1 lấy top 1.