कर्सर आधारित पेजिनेशन को संग्रह में किसी भी फ़ील्ड का उपयोग करके कार्यान्वित किया जा सकता है जो अद्वितीय, आदेश देने योग्य और अपरिवर्तनीय है .
_id
सभी को संतुष्ट करें अद्वितीय, क्रमबद्ध और अपरिवर्तनीय स्थितियाँ। इस फ़ील्ड के आधार पर हम _id
. के साथ पेज परिणाम को सॉर्ट और रिटर्न कर सकते हैं बाद के अनुरोध के लिए कर्सर के रूप में अंतिम दस्तावेज़।
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 })
जब उपयोगकर्ता दूसरा पृष्ठ प्राप्त करना चाहता है, तो वे यूआरएल पर कर्सर (अगले के रूप में) पास करते हैं: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 })
यदि हम किसी भिन्न क्रम में परिणाम वापस करना चाहते हैं, जैसे कि आइटम की तारीख तो हम जोड़ देंगे sort=launchDate
क्वेरीस्ट्रिंग के लिए।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 })
बाद के पेज अनुरोध के लिए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 });
अगर हम एक ही दिन और समय पर वस्तुओं का एक गुच्छा लॉन्च करते हैं? अब हमारा launchDate
फ़ील्ड अब अद्वितीय नहीं है और अद्वितीय, व्यवस्थित और अपरिवर्तनीय satisfy को संतुष्ट नहीं करती है . स्थिति। हम इसे कर्सर फ़ील्ड के रूप में उपयोग नहीं कर सकते हैं। लेकिन हम कर्सर उत्पन्न करने के लिए दो क्षेत्रों का उपयोग कर सकते हैं। चूंकि हम जानते हैं कि _id
MongoDB में फ़ील्ड हमेशा उपरोक्त तीन शर्तों को पूरा करती है, हम जानते हैं कि यदि हम इसे अपने launchDate
के साथ उपयोग करते हैं फ़ील्ड, दो फ़ील्ड का संयोजन आवश्यकताओं को पूरा करेगा और एक साथ कर्सर फ़ील्ड के रूप में उपयोग किया जा सकता है।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 });
बाद के पेज अनुरोध के लिए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 });
प्रतिक्रिया:https://engineering.mixmax.com/ ब्लॉग/एपीआई-पेजिंग-बिल्ट-द-राइट-वे/