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 sideanmodningcurl 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 sideanmodningcurl 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/