sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan implementerer man twitter og facebook api som markørbaseret paginering i mongodb i nodejs ved hjælp af officiel mongodb-klient?

Markørbaseret paginering kan implementeres ved hjælp af et hvilket som helst felt i samlingen, som er Unik, Bestilbar og uforanderlig .

_id opfylde alle Unikke, Bestilbare og Uændrede betingelser. Baseret på dette felt kan vi sortere og returnere sideresultater med _id af sidste dokument som cussor for efterfølgende anmodning.

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 })

når brugeren vil have den anden side, sender de markøren (som næste) på URL'en: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 })

Hvis vi ønsker at returnere resultater i en anden rækkefølge, såsom datoen for varen, tilføjer vi sort=launchDate til forespørgselsstrengen.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 })

For efterfølgende sideanmodning
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 });

Hvis vi lancerede en masse varer på samme dag og tidspunkt? Nu er vores launchDate feltet er ikke længere unikt og opfylder ikke Unique, Orderable og Immutable . tilstand. Vi kan ikke bruge det som et markørfelt. Men vi kunne bruge to felter til at generere markøren. Da vi ved, at _id felt i MongoDB altid opfylder ovenstående tre betingelser, vi ved, at hvis vi bruger det sammen med vores launchDate feltet, ville kombinationen af ​​de to felter opfylde kravene og kunne bruges sammen som et markørfelt.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 });

For efterfølgende sideanmodning
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 });

Reference:https://engineering.mixmax.com/ blog/api-paging-built-the-right-way/




  1. Liste over alle samlinger i mongo-databasen i java

  2. MongoDB Schema Design - Ny samling eller reference?

  3. Kan du oprette forbindelse til Amazon ElastiСache Redis uden for Amazon?

  4. db.cloneCollection ignorer dublerede nøgler