MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Lazy Loading/More Data Scroll in Mongoose/Nodejs

Das allgemeine Konzept des „Paging“ ist die Verwendung von .skip() die im Wesentlichen die bereits abgerufenen Ergebnisse "überspringt", sodass Sie im Wesentlichen Folgendes tun können:

var q = Post.find().sort( "rating" ).skip(10).limit(10);

Aber wirklich, wie Sie sich vorstellen können, wird sich dies erheblich verlangsamen, wenn Sie ein paar "Seiten" eingeben. Sie möchten also wirklich etwas Klügeres. Im Wesentlichen ist dies eine „Bereichsabfrage“, bei der Sie höhere (oder niedrigere, wenn absteigend ) Ergebnisse als die zuletzt abgerufenen Ergebnisse abrufen möchten. Also gegeben der letzte Wert von 5 dann für mehr als Sie tun würden:

var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);

Sieht gut aus, aber es gibt wirklich noch ein Problem. Was wäre, wenn die nächste „Seite“ auch Ergebnisse mit einer Bewertung von 5 enthalten würde? Diese Abfrage würde diese überspringen und nie anzeigen.

Das Klügste ist, die gesamte _id zu "behalten". Werte aus dem Dokument, da es sich um eindeutige Schlüssel handelt. Wenden Sie im Grunde dasselbe an, außer dass Sie dieses Mal sicherstellen, dass Sie die Ergebnisse der vorherigen Seite nicht in Ihre neue einbeziehen. Der $nin Operator hilft hier:

var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
    .sort( "rating" ).limit(10);

Ob die seenIds nur die letzte Ergebnisseite oder mehr ist, hängt von der "Dichte" des Werts ab, nach dem Sie sortieren, und natürlich müssen Sie diese in einer Sitzungsvariablen oder so etwas "halten".

Aber versuchen Sie, dies anzupassen, da Bereichsabfragen normalerweise Ihr bestes Leistungsergebnis sind.