Vấn đề
Tính khoảng thời gian giữa 2 trường timestamp (ISODate) trong MongoDB, kết quả trả về đơn vị giờ.
Giải pháp: Aggregation Pipeline
Sử dụng $subtract để lấy chênh lệch milliseconds, sau đó $divide cho 3.600.000 (ms/giờ).
Ví dụ minh họa
1. Tạo collection dữ liệu phim
> db.timestampDifferenceDemo.insertOne({
"MovieBeginningTime": new ISODate("2019-05-12 10:20:30"),
"MovieEndingTime": new ISODate("2019-05-12 12:30:20")
});
> db.timestampDifferenceDemo.insertOne({
"MovieBeginningTime": new ISODate("2019-05-12 04:00:00"),
"MovieEndingTime": new ISODate("2019-05-12 07:10:00")
});
2. Pipeline aggregation
> db.timestampDifferenceDemo.aggregate([
{$project: {
DifferenceInHours: {$divide: [{$subtract: ["$MovieEndingTime", "$MovieBeginningTime"]}, 3600000]}
}}
]);
3. Kết quả
{ "_id" : ObjectId("5cd7ba1f6d78f205348bc644"), "DifferenceInHours" : 2.1638888888888888 }
{ "_id" : ObjectId("5cd7ba3b6d78f205348bc645"), "DifferenceInHours" : 3.1666666666666665 }
Giải thích
$subtract: ["$end", "$start"]→ chênh lệch milliseconds (số nguyên).$divide: [chênh_lệch_ms, 3600000]→ chuyển sang giờ (số thực).- 3600000 = 1000 ms × 60 s × 60 min.
Mở rộng
Để lấy giờ, phút, giây riêng biệt: dùng $floor, $mod hoặc các toán tử date như $hour, $minute, $second sau khi chuyển chênh lệch về Date object.