ใช้ $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 จากหลายวันที่เริ่มต้น