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

MongoDB: หาวันที่เก่าที่สุด (Oldest Date) จาก 3 ฟิลด์ในแต่ละเอกสาร

ใช้ $min ใน $project ของ aggregation เพื่อหาค่าต่ำสุด (เก่าที่สุด) จาก 3 ฟิลด์วันที่ สร้างคอลเลกชันตัวอย่าง:

> db.demo353.insertOne({"Date1":new ISODate("2019-01-10"),"Date2":new ISODate("2016-01-21"),"Date3":new ISODate("2020-04-11")});
{ "acknowledged" : true, "insertedId" : ObjectId("5e568261f8647eb59e5620be") }
> db.demo353.insertOne({"Date1":new ISODate("2011-11-20"),"Date2":new ISODate("2013-12-10"),"Date3":new ISODate("2014-01-05")});
{ "acknowledged" : true, "insertedId" : ObjectId("5e56827ff8647eb59e5620bf") }

แสดงข้อมูล:

> db.demo353.find();

คิวรีหาวันที่เก่าที่สุดในแต่ละเอกสาร:

> db.demo353.aggregate([
  { $project: {
    OldestDate: {
      $min: [
        { $ifNull: ["$Date1", new Date()] },
        { $ifNull: ["$Date2", new Date()] },
        { $ifNull: ["$Date3", new Date()] }
      ]
    }
  }}
])

ผลลัพธ์:

{ "_id" : ObjectId("5e568261f8647eb59e5620be"), "OldestDate" : ISODate("2016-01-21T00:00:00Z") }
{ "_id" : ObjectId("5e56827ff8647eb59e5620bf"), "OldestDate" : ISODate("2011-11-20T00:00:00Z") }

คำอธิบาย

  • $min รับอาร์เรย์ของค่า คืนค่าที่น้อยที่สุด (สำหรับวันที่ = เก่าที่สุด)
  • $ifNull: ["$Date1", new Date()]: หาก Date1 missing/null ใช้ current date แทน (ป้องกัน error)
  • ทำงานได้กับ ISODate, string date (ต้อง $toDate ก่อน), timestamp
  • ใช้ใน $project เพื่อเพิ่มฟิลด์ใหม่ คงเอกสารเดิมไว้

การประยุกต์

เหมาะสำหรับหา earliest timestamp ใน event logs, หรือคำนวณ tenure/age จากหลายวันที่เริ่มต้น