Ich schreibe eine Webapp mit Node.js und Mungo. Wie kann ich die Ergebnisse eines .find()
Anrufs paginieren ? Ich möchte eine Funktionalität, die mit "LIMIT 50,100"
SQL vergleichbar ist .
mongodb
node.js
pagination
mongoose
Thomas
quelle
quelle
Antworten:
Ich bin sehr enttäuscht von den akzeptierten Antworten in dieser Frage. Dies wird nicht skaliert. Wenn Sie das Kleingedruckte auf cursor.skip () lesen:
Um eine skalierbare Paginierung zu erreichen, kombinieren Sie ein Limit () mit mindestens einem Filterkriterium. Ein Erstellungsdatum eignet sich für viele Zwecke.
quelle
-createdOn
' geordnet sind , den Wert vonrequest.createdOnBefore
durch den niedrigsten Wert voncreatedOn
in der vorherigen Ergebnismenge ersetzen würden. und dann Requery.Nachdem ich mir die Mongoose-API mit den von Rodolphe bereitgestellten Informationen genauer angesehen hatte, fand ich diese Lösung heraus:
quelle
Paginierung mit Mungo, Express und Jade - Hier ist ein Link zu meinem Blog mit mehr Details
quelle
Math.max(0, undefined)
wird zurückkehrenundefined
, das hat bei mir funktioniert:let limit = Math.abs(req.query.limit) || 10;
let page = (Math.abs(req.query.page) || 1) - 1;
Schema.find().limit(limit).skip(limit * page)
Sie können einfach so verketten:
Führen Sie die Abfrage mit aus
exec
quelle
var page = req.param('p'); var per_page = 10; if (page == null) { page = 0; } Location.count({}, function(err, count) { Location.find({}).skip(page*per_page).limit(per_page).execFind(function(err, locations) { res.render('index', { locations: locations }); }); });
In diesem Fall können Sie die Abfrage
page
und / oderlimit
Ihre URL als Abfragezeichenfolge hinzufügen .Beispielsweise:
?page=0&limit=25 // this would be added onto your URL: http:localhost:5000?page=0&limit=25
Da es ein wäre, müssen
String
wir esNumber
für unsere Berechnungen in ein konvertieren . Machen wir es mit derparseInt
Methode und geben wir auch einige Standardwerte an.BTW Paginierung beginnt mit
0
quelle
mongoose
.Sie können ein kleines Paket namens Mongoose Paginate verwenden , das es einfacher macht.
Fügen Sie nach Ihren Routen oder Ihrem Controller einfach Folgendes hinzu:
quelle
Dies ist ein Beispielbeispiel, das Sie ausprobieren können.
quelle
Versuchen Sie, die Mungofunktion für die Paginierung zu verwenden. Limit ist die Anzahl der Datensätze pro Seite und die Anzahl der Seiten.
quelle
Das habe ich mit Code gemacht
So habe ich es gemacht.
quelle
count()
ist veraltet. Verwenden SiecountDocuments()
Abfrage;
search = productName,
Params;
Seite = 1
quelle
Hier ist eine Version, die ich an alle meine Modelle anhänge. Dies hängt vom Unterstrich ab und ist für die Leistung asynchron. Die Optionen ermöglichen die Auswahl und Sortierung von Feldern mithilfe der Mungosyntax.
Hängen Sie es an Ihr Modellschema an.
quelle
Die obige Antwort gilt.
quelle
Einfache und leistungsstarke Paginierungslösung
last_doc_id
: Die letzte Dokument-ID, die Sie erhaltenno_of_docs_required
: Die Anzahl der Dokumente, die Sie abrufen möchten, z. B. 5, 10, 50 usw.last_doc_id
die Methode nicht angeben , erhalten Sie dh 5 neueste Dokumentelast_doc_id
Sie die nächsten, dh 5 Dokumente.quelle
Sie können auch die folgende Codezeile verwenden
Dieser Code funktioniert in der neuesten Version von Mongo
quelle
Ein solider Ansatz, um dies zu implementieren, besteht darin, die Werte vom Frontend mithilfe einer Abfragezeichenfolge zu übergeben . Lassen Sie uns sagen , dass wir erhalten möchten Seite # 2 und auch begrenzen die Ausgabe auf 25 Ergebnisse .
Die Abfragezeichenfolge würde folgendermaßen aussehen:
?page=2&limit=25 // this would be added onto your URL: http:localhost:5000?page=2&limit=25
Sehen wir uns den Code an:
Ich würde vorschlagen, diese Logik in Middleware zu implementieren, damit Sie sie für verschiedene Routen / Controller verwenden können.
quelle
Der einfachste und schnellere Weg ist, mit dem objectId-Beispiel zu paginieren.
Anfangslastzustand
Nehmen Sie die erste und letzte ObjectId aus den Antwortdaten
Seite nächste Bedingung
Seite nächste Bedingung
Im Mungo
quelle
Der beste Ansatz (IMO) ist das Überspringen und Begrenzen von ABER innerhalb begrenzter Sammlungen oder Dokumente.
Um die Abfrage in begrenzten Dokumenten durchzuführen, können wir einen bestimmten Index wie einen Index für ein Feld vom Typ DATE verwenden. Siehe das unten
quelle
Einfachstes Plugin für die Paginierung.
https://www.npmjs.com/package/mongoose-paginate-v2
Fügen Sie einem Schema ein Plugin hinzu und verwenden Sie dann die Modell-Paginate-Methode:
quelle
Dies ist eine Beispielfunktion, um das Ergebnis eines Skills-Modells mit Paginierungs- und Limit-Optionen zu erhalten
}}
quelle
Sie können eine solche Abfrage schreiben.
Seite: Seitennummer vom Client als Anforderungsparameter.
per_page: Anzahl der pro Seite angezeigten Ergebnisse
Wenn Sie den MEAN-Stack verwenden, enthält der folgende Blog-Beitrag viele Informationen zum Erstellen einer Paginierung im Front-End mithilfe des Bootstraps mit eckiger Benutzeroberfläche und der Verwendung von Mungo-Skip- und Limit-Methoden im Backend.
siehe: https://techpituwa.wordpress.com/2015/06/06/mean-js-pagination-with-angular-ui-bootstrap/
quelle
Sie können entweder skip () und limit () verwenden, aber es ist sehr ineffizient. Eine bessere Lösung wäre eine Sortierung nach indiziertem Feld plus limit (). Wir bei Wunderflats haben hier eine kleine Bibliothek veröffentlicht: https://github.com/wunderflats/goosepage Es verwendet den ersten Weg.
quelle
Wenn Sie Mungo als Quelle für eine erholsame API verwenden, schauen Sie sich ' restify-mongoose ' an ' und seine Abfragen an. Es hat genau diese Funktionalität eingebaut.
Jede Abfrage in einer Sammlung enthält Header, die hier hilfreich sind
Grundsätzlich erhalten Sie also einen generischen Server mit einer relativ linearen Ladezeit für Abfragen an Sammlungen. Das ist großartig und etwas zu sehen, wenn Sie in eine eigene Implementierung gehen möchten.
quelle
quelle
quelle
Verwenden Sie dieses einfache Plugin.
https://github.com/WebGangster/mongoose-paginate-v2
Installation
quelle
gemäß
Antworten:
quelle
Mit ts-Mungo-Paginierung
quelle
quelle
Konnte auch mit async / await Ergebnisse erzielen.
Codebeispiel unten mit einem asynchronen Handler mit Hapi v17 und Mungo v5
quelle