Ich habe kürzlich das gleiche Problem festgestellt, als ich versuchte, eine Anfrage zu paginieren, während ich ein Feld verwendete, das nicht eindeutig war, zum Beispiel "Vorname". Die Idee dieser Abfrage ist es, die Paginierung in einem nicht eindeutigen Feld ohne Verwendung von skip () implementieren zu können.
Das Hauptproblem hierbei ist die Möglichkeit, ein Feld abzufragen, das nicht eindeutig "Vorname" ist, da Folgendes passieren wird:
- $ gt: {"Vorname": "Carlos"} -> Dadurch werden alle Datensätze übersprungen, bei denen der Vorname "Carlos" ist.
- $ gte: {"Vorname": "Carlos"} -> gibt immer den gleichen Datensatz zurück
Daher bestand die Lösung darin, den $ match-Teil der Abfrage eindeutig zu machen, indem das Zielsuchfeld mit einem sekundären Feld kombiniert wurde, um eine eindeutige Suche zu erstellen.
Aufsteigende Reihenfolge:
db.customers.aggregate([
{$match: { $or: [ {$and: [{'FirstName': 'Carlos'}, {'_id': {$gt: ObjectId("some-object-id")}}]}, {'FirstName': {$gt: 'Carlos'}}]}},
{$sort: {'FirstName': 1, '_id': 1}},
{$limit: 10}
])
Absteigende Reihenfolge:
db.customers.aggregate([
{$match: { $or: [ {$and: [{'FirstName': 'Carlos'}, {'_id': {$gt: ObjectId("some-object-id")}}]}, {'FirstName': {$lt: 'Carlos'}}]}},
{$sort: {'FirstName': -1, '_id': 1}},
{$limit: 10}
])
Der $ match-Teil dieser Abfrage verhält sich im Grunde genommen wie eine if-Anweisung: Wenn firstName "Carlos" ist, muss er auch größer als diese ID sein. Wenn firstName nicht gleich "Carlos" ist, muss er größer als "Carlos" sein.
Das einzige Problem ist, dass Sie nicht zu einer bestimmten Seitenzahl navigieren können (dies kann wahrscheinlich mit einer gewissen Code-Manipulation durchgeführt werden), aber abgesehen davon hat es mein Problem mit der Paginierung für nicht eindeutige Felder gelöst, ohne überspringen zu müssen, was viel Speicher und Verarbeitung verbraucht Leistung, wenn Sie am Ende des Datensatzes angelangt sind, nach dem Sie fragen.