sql >> Databáze >  >> NoSQL >> MongoDB

Jak implementovat twitter a facebook api jako kurzorové stránkování v mongodb v nodejs pomocí oficiálního klienta mongodb?

Stránkování na základě kurzoru lze implementovat pomocí libovolného pole v kolekci, které je jedinečné, objednatelné a neměnné .

_id uspokojit všechny jedinečné, objednatelné a neměnné podmínky. Na základě tohoto pole můžeme seřadit a vrátit výsledek stránky s _id posledního dokumentu jako příjemce pro následnou žádost.

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

když chce uživatel získat druhou stránku, přejede kurzor (jako další) na adresu 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 })

Pokud chceme vrátit výsledky v jiném pořadí, jako je datum položky, přidáme sort=launchDate na řetězec dotazu.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 })

Pro další žádost o stránku
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 });

Pokud bychom spustili spoustu položek ve stejný den a čas? Nyní naše launchDate pole již není jedinečné a nesplňuje požadavky Unikátní, objednatelné a neměnné . stav. Nemůžeme ho použít jako kurzorové pole. Ke generování kurzoru bychom ale mohli použít dvě pole. Protože víme, že _id pole v MongoDB vždy splňuje výše uvedené tři podmínky, víme, že pokud je použijeme spolu s naším launchDate pole by kombinace těchto dvou polí vyhovovala požadavkům a mohla by být společně použita jako pole kurzoru.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 });

Pro další žádost o stránku
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 });

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




  1. vytvoření skupiny a analýza dat ze seznamu polí v Birt

  2. Tipy pro ukládání záloh MongoDB v cloudu

  3. Hlavní rysy MapReduce – Význam MapReduce

  4. Porovnejte dvě datová pole v MongoDB