ใช้ $addFields คำนวณระยะเวลา $subtract ระหว่าง endDate และ startDate แล้ว $sort และ $limit เพื่อหาเอกสารที่มีช่วงเวลานานที่สุด สร้างคอลเลกชันตัวอย่าง:
> db.demo344.insertOne({"startDate":"2020-02-24 10:50:00", "endDate":"2020-02-24 11:50:00"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e53f52cf8647eb59e5620aa") }
> db.demo344.insertOne({"startDate":"2020-02-24 08:00:00", "endDate":"2020-02-24 11:50:50"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e53f53df8647eb59e5620ab") }
แสดงข้อมูล:
> db.demo344.find();
คิวรีหาช่วงเวลานานที่สุด:
> db.demo344.aggregate([
{ $addFields: {
longestTime: { $subtract: [ { $toDate: "$endDate" }, { $toDate: "$startDate" } ] }
}},
{ $sort: { longestTime: -1 } },
{ $limit: 1 }
])
ผลลัพธ์ (เอกสารที่ 2 ระยะเวลา 13,850,000 ms = ~3.85 ชั่วโมง):
{ "_id" : ObjectId("5e53f53df8647eb59e5620ab"), "startDate" : "2020-02-24 08:00:00", "endDate" : "2020-02-24 11:50:50", "longestTime" : NumberLong(13850000) }
คำอธิบาย
$toDate: แปลง string เป็น Date object (MongoDB 4.0+)$subtract: ลบ Date ได้ผลลัพธ์เป็น milliseconds (NumberLong)
3. $limit: 1: เอาแค่ตัวแรก (นานที่สุด)
$sort: {longestTime: -1}: เรียงมากไปน้อย
ข้อมูลเพิ่มเติม
- หากข้อมูลเป็น ISODate อยู่แล้ว ไม่ต้อง $toDate
- แปลงเป็นชั่วโมง:
{$divide: ["$longestTime", 3600000]} - ใช้
$dateDiff(MongoDB 5.0+) สำหรับการคำนวณวันที่ที่แม่นยำกว่า