เรียงลำดับเอกสารตาม _id (ObjectId) ด้วย sort()
ฟิลด์ _id ใน MongoDB เป็น ObjectId ซึ่งประกอบด้วย Timestamp (4 ไบต์แรก) Machine ID, Process ID, และ Counter การเรียงตาม _id จึงเทียบเท่ากับการเรียงตามเวลาสร้างเอกสาร (ประมาณ)
ตัวอย่างข้อมูลทดสอบ
> db.demo403.insertOne({ "Name": "Chris" });
> db.demo403.insertOne({ "Name": "David" });
> db.demo403.insertOne({ "Name": "Bob" });
> db.demo403.insertOne({ "Name": "Adam" });
แสดงข้อมูล (เรียงตาม _id ใส่เข้าไป)
> db.demo403.find();
ผลลัพธ์:
{ "_id": ObjectId("5e6f89b0fac4d418a017858e"), "Name": "Chris" }
{ "_id": ObjectId("5e6f89b2fac4d418a017858f"), "Name": "David" }
{ "_id": ObjectId("5e6f89b5fac4d418a0178590"), "Name": "Bob" }
{ "_id": ObjectId("5e6f89b8fac4d418a0178591"), "Name": "Adam" }
คำสั่งเรียงตาม _id จากใหม่ไปเก่า (Descending)
> db.demo403.find().sort({ _id: -1 });
ผลลัพธ์ที่ได้
{ "_id": ObjectId("5e6f89b8fac4d418a0178591"), "Name": "Adam" }
{ "_id": ObjectId("5e6f89b5fac4d418a0178590"), "Name": "Bob" }
{ "_id": ObjectId("5e6f89b2fac4d418a017858f"), "Name": "David" }
{ "_id": ObjectId("5e6f89b0fac4d418a017858e"), "Name": "Chris" }
คำอธิบาย
- sort({ _id: 1 }): เรียงเก่าไปใหม่ (Ascending) - ตามลำดับเวลาสร้าง
- sort({ _id: -1 }): เรียงใหม่ไปเก่า (Descending) - ล่าสุดอยู่บนสุด
ข้อดีของการเรียงตาม ObjectId
- ไม่ต้องมีฟิลด์ createdAt แยกต่างหาก
- ObjectId มี Timestamp built-in (4 ไบต์แรก = Unix timestamp วินาที)
- ดัชนี _id มีอยู่โดยอัตโนมัติ (Unique Index) เรียงได้เร็ว
- สามารถดึง Timestamp ได้:
ObjectId("...").getTimestamp()
กรณีที่ควรใช้ createdAt แทน
- ต้องการเวลาที่แม่นยำถึงมิลลิวินาที (ObjectId แค่วินาที)
- มีการ import ข้อมูลที่ _id ไม่สะท้อนเวลาจริง
- ต้องการ Timezone หรือรูปแบบวันที่เฉพาะ