Penomoran berbasis kursor dapat diimplementasikan menggunakan bidang apa pun dalam koleksi yang Unik, Dapat Diurutkan, dan Tidak Dapat Diubah .
_id
memuaskan semua Unik, Dapat Dipesan, dan Tidak Dapat Diubah kondisi. Berdasarkan bidang ini kita dapat mengurutkan dan mengembalikan hasil halaman dengan _id
dokumen terakhir sebagai cusror untuk permintaan selanjutnya.
curl https://api.mixmax.com/items?limit=2
const items = db.items.find({}).sort({
_id: -1
}).limit(2);
const next = items[items.length - 1]._id
res.json({ items, next })
ketika pengguna ingin mendapatkan halaman kedua, mereka meneruskan kursor (seperti berikutnya) pada URL:curl https://api.mixmax.com/items?limit=2&next=590e9abd4abbf1165862d342
const items = db.items.find({
_id: { $lt: req.query.next }
}).sort({
_id: -1
}).limit(2);
const next = items[items.length - 1]._id
res.json({ items, next })
Jika kita ingin mengembalikan hasil dalam urutan yang berbeda, seperti tanggal item maka kita akan menambahkan sort=launchDate
ke string kueri.curl https://api.mixmax.com/items?limit=2&sort=launchDate
const items = db.items.find({}).sort({
launchDate: -1
}).limit(2);
const next = items[items.length - 1].launchDate;
res.json({ items, next })
Untuk permintaan halaman selanjutnyacurl https://api.mixmax.com/items?limit=2&sort=launchDate&next=2017-09-11T00%3A44%3A54.036Z
const items = db.items.find({
launchDate: { $lt: req.query.next }
}).sort({
_id: -1
}).limit(2);
const next = items[items.length - 1].launchDate;
res.json({ items, next });
Jika kami meluncurkan banyak item pada hari dan waktu yang sama? Sekarang launchDate
bidang tidak lagi unik dan tidak memenuhi Unik, Dapat Dipesan, dan Tidak Dapat Diubah . kondisi. Kami tidak dapat menggunakannya sebagai bidang kursor. Tapi kita bisa menggunakan dua bidang untuk menghasilkan kursor. Karena kita tahu bahwa _id
field di MongoDB selalu memenuhi ketiga kondisi di atas, kita tahu bahwa jika kita menggunakannya bersama launchDate
kita bidang, kombinasi dari dua bidang akan memenuhi persyaratan dan dapat bersama-sama digunakan sebagai bidang kursor.curl https://api.mixmax.com/items?limit=2&sort=launchDate
const items = db.items.find({}).sort({
launchDate: -1,
_id: -1 // secondary sort in case there are duplicate launchDate values
}).limit(2);
const lastItem = items[items.length - 1];
// The cursor is a concatenation of the two cursor fields, since both are needed to satisfy the requirements of being a cursor field
const next = `${lastItem.launchDate}_${lastItem._id}`;
res.json({ items, next });
Untuk permintaan halaman selanjutnyacurl https://api.mixmax.com/items?limit=2&sort=launchDate&next=2017-09-11T00%3A44%3A54.036Z_590e9abd4abbf1165862d342
const [nextLaunchDate, nextId] = req.query.next.split(‘_’);
const items = db.items.find({
$or: [{
launchDate: { $lt: nextLaunchDate }
}, {
// If the launchDate is an exact match, we need a tiebreaker, so we use the _id field from the cursor.
launchDate: nextLaunchDate,
_id: { $lt: nextId }
}]
}).sort({
_id: -1
}).limit(2);
const lastItem = items[items.length - 1];
// The cursor is a concatenation of the two cursor fields, since both are needed to satisfy the requirements of being a cursor field
const next = `${lastItem.launchDate}_${lastItem._id}`;
res.json({ items, next });
Referensi:https://engineering.mixmax.com/ blog/api-paging-built-the-right-way/