Cara Menggunakan Pagination di MongoDB

Pagination adalah teknik yang digunakan untuk membagi data menjadi beberapa bagian atau halaman, sehingga memudahkan pengguna dalam mengakses data dalam jumlah besar. Di MongoDB, pagination dapat diimplementasikan menggunakan beberapa metode, seperti skip() dan limit(), atau dengan cursor berbasis ID untuk performa yang lebih baik.

1. Menggunakan skip() dan limit()

Metode paling sederhana untuk melakukan pagination di MongoDB adalah dengan menggabungkan skip() dan limit().

  • limit(n): Membatasi jumlah dokumen yang dikembalikan.
  • skip(n): Melewati sejumlah dokumen sebelum menampilkan hasil.

Contoh Implementasi:

// Halaman 1: Menampilkan 10 data pertama
db.collection.find().limit(10);

// Halaman 2: Melewati 10 data pertama dan menampilkan 10 berikutnya
db.collection.find().skip(10).limit(10);

// Halaman 3: Melewati 20 data pertama dan menampilkan 10 berikutnya
db.collection.find().skip(20).limit(10);

Kelemahan Metode Ini:

  • Semakin besar nilai skip(), semakin lambat performanya karena MongoDB harus memindai semua dokumen yang dilewati.

2. Pagination Menggunakan _id atau Field Indeks Lainnya

Untuk meningkatkan performa, kita bisa menggunakan field yang terindeks (seperti _id) sebagai penanda (cursor) alih-alih menggunakan skip().

Contoh Implementasi:

// Halaman 1: Ambil 10 data pertama
const firstPage = db.collection.find().sort({ _id: 1 }).limit(10);
let lastId = firstPage[firstPage.length - 1]._id;

// Halaman 2: Ambil data setelah `lastId`
const nextPage = db.collection.find({ _id: { $gt: lastId } })
                              .sort({ _id: 1 })
                              .limit(10);
lastId = nextPage[nextPage.length - 1]._id;

// Lanjutkan untuk halaman berikutnya

Keuntungan:

  • Lebih cepat karena menggunakan indeks dan tidak perlu memindai semua dokumen sebelumnya.

3. Menggunakan aggregate() untuk Pagination Kompleks

Jika membutuhkan pagination dengan pengurutan atau filter yang lebih kompleks, kita bisa menggunakan pipeline aggregate().

Contoh Implementasi:

db.collection.aggregate([
  { $match: { status: "active" } }, // Filter data
  { $sort: { createdAt: -1 } },     // Urutkan berdasarkan tanggal
  { $skip: 20 },                    // Lewati 20 dokumen
  { $limit: 10 }                    // Batasi 10 dokumen per halaman
]);

Kesimpulan

  • Untuk pagination sederhana, gunakan skip() dan limit(), tetapi hati-hati dengan performa pada dataset besar.
  • Untuk performa lebih baik, gunakan cursor berbasis ID atau field terindeks lainnya.
  • Jika membutuhkan operasi kompleks (filter, pengurutan), gunakan aggregate().