Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB: Query หา Object ที่มีช่วงเวลานานที่สุด (Longest Time Period)

ใช้ $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. $sort: {longestTime: -1}: เรียงมากไปน้อย
  • $limit: 1: เอาแค่ตัวแรก (นานที่สุด)

ข้อมูลเพิ่มเติม

  • หากข้อมูลเป็น ISODate อยู่แล้ว ไม่ต้อง $toDate
  • แปลงเป็นชั่วโมง: {$divide: ["$longestTime", 3600000]}
  • ใช้ $dateDiff (MongoDB 5.0+) สำหรับการคำนวณวันที่ที่แม่นยำกว่า