ใช้ sort() และ limit() สำหรับ Pagination แบบ Real-time
เพื่อดึงข้อมูลล่าสุด N รายการ ให้เรียงลำดับตามฟิลด์ที่บ่งบอกลำดับเวลา (เช่น _id, createdAt) แล้วจำกัดจำนวนด้วย limit()
ตัวอย่างข้อมูล
> db.demo454.insertOne({ "ClientName": "Chris" });
> db.demo454.insertOne({ "ClientName": "John" });
> db.demo454.insertOne({ "ClientName": "Bob" });
> db.demo454.insertOne({ "ClientName": "David" });
> db.demo454.insertOne({ "ClientName": "Mike" });
Query ดึง 3 รายการล่าสุด เรียงตาม ClientName DESC
> db.demo454.find().sort({ ClientName: -1 }).limit(3);
ผลลัพธ์
{ "_id": ObjectId(...), "ClientName": "Mike" }
{ "_id": ObjectId(...), "ClientName": "John" }
{ "_id": ObjectId(...), "ClientName": "David" }
แนวทางปฏิบัติที่ดีสำหรับ Production
- ใช้ _id หรือ createdAt - _id มี timestamp ติดมาแล้ว เรียง -1 ได้ล่าสุด
- สร้าง Index -
db.demo454.createIndex({ ClientName: -1 })หรือ{ _id: -1 } - หลีกเลี่ยง skip() สำหรับหน้าลึก - ใช้ range-based pagination (cursor-based) แทน
Cursor-based Pagination (แนะนำ)
// หน้าแรก
db.demo454.find().sort({ _id: -1 }).limit(10);
// หน้าถัดไป (ใช้ _id ของรายการสุดท้ายจากหน้าก่อน)
db.demo454.find({ _id: { $lt: lastSeenId } }).sort({ _id: -1 }).limit(10);
สำหรับ Real-time / Continuous Publishing
- ใช้ Tailable Cursor บน Capped Collection
- หรือ Change Streams (MongoDB 3.6+) สำหรับ real-time notifications
- หรือ Polling ด้วย timestamp/_id เป็น cursor