Ordnen nach Subjekt-ID
Wenn Ihre subjectID
ein monoton ansteigender Wert ist (oder geändert werden kann) (z. B. eine MongoDB-Standard-ObjectID), haben Sie eine direkte Option mit einem normalen find()
mit entsprechendem Sortieren, Überspringen und Begrenzen. In diesem Fall können Sie nach Dokumenten mit den SubjectIDs $gte
(größer oder gleich)
Ihre subjectID
:
var page = 1;
var subjectID = ObjectId("515535a0760fe8735f5f6897");
db.users.find(
{ _id: { $gte : subjectID } }
).sort({'_id':1}).skip(page*20).limit(20)
Aggregations-Framework
Wie bei MongoDb 2.4 gibt es keine solche Funktion im Aggregation Framework, die basierend auf der Dokumentposition in der Ergebnispipeline abgeglichen werden kann. Sie können einen Vorschlag für eine neue Funktion beim SERVER des MongoDB Jira-Projekts einreichen Warteschlange.
Es hört sich so an, als würden Sie einen neuen Pipeline-Operator wie $matchfrom
wollen was alle Dokumente bis zum ersten Auftreten von $matchfrom
ignorieren würde Kriterien. Sie könnten dann ein $limit
hinzufügen um die nächsten n Elemente zu nehmen. Sie möchten auch eine sortierte Ausgabe vor $matchfrom
haben es gibt also ein vorhersehbares Ergebnis.
Dies scheint im Vergleich zu einer zunehmenden Subjekt-ID zu kompliziert zu sein, aber es kann einen Anwendungsfall geben, Paging basierend auf fortgeschritteneren Suchkriterien oder Ergebnissen durchzuführen, die in der Aggregationspipeline berechnet werden.
Alternative Ansätze
Abgesehen von der zukünftigen Unterstützung für eine solche Funktion im Aggregation Framework haben Sie einige Optionen, um denselben Abgleichansatz im Code zu implementieren:
-
Verwenden Sie den älteren
group()
Aggregationsbefehl mit einemfinalize()
Funktion. HINWEIS:group()
tut nicht arbeiten mit fragmentierten Clustern. -
Verwenden Sie MapReduce und ein
finalize()
Funktion -
Holen Sie sich die gesamte Ergebnismenge aus dem Aggregation Framework und implementieren Sie den Abgleich/die Reduzierung der Ergebnisse in Ihrem Anwendungscode (obwohl dies den „Paging“-Gedanken etwas zunichte macht, wenn Sie alle Seiten für jede Anfrage abrufen).
Überlegungen zur Leistung
Abfragen mit überspringen
immer noch die dazwischen liegenden Indexeinträge durchlesen müssen, daher ist das Überspringen einer großen Anzahl von Dokumenten nicht sehr effizient.
Anstatt mit einem Skip-Offset zu blättern, könnten Sie in Betracht ziehen, aufeinanderfolgende Seitenabfragen durchzuführen, indem Sie mit dem letzten Eintrag der vorherigen Seite beginnen (d. h. die erste Seite wäre $gte
die Startsubjekt-ID und nachfolgende Seiten wären $gt
die letzte Subjekt-ID, die auf der vorherigen Seite enthalten ist). Dies hängt davon ab, wie Sie das Paging in Ihrer Benutzeroberfläche darstellen – es wäre am einfachsten, diesen Ansatz zu verwenden, wenn Ihre Benutzeroberfläche nur die Option hätte, die „nächste“ Seite von Nachrichten anzuzeigen, anstatt zu einer bestimmten Seite zu springen.