MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bagaimana cara menerapkan api Twitter dan facebook seperti pagination berbasis kursor di mongodb di nodejs menggunakan klien mongodb resmi?

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 selanjutnya
curl 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 selanjutnya
curl 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/




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. perbarui mongodb jika bidang tidak ada

  2. Hasil grup dengan interval waktu 15 menit di MongoDb

  3. Cara Memperbarui Array Subdokumen pada Koleksi MongoDB di MeteorJS

  4. Tidak dapat membuat mongodump cadangan dengan --db. Otentikasi gagal

  5. Windows MongoDB - Kompas Terinstal tetapi tidak dapat menemukan Kompas di dalam sistem