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

Rufen Sie den Index eines Elements in der Mongodb-Abfrage ab

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 einem finalize() 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.