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

Bereichsabfrage für MongoDB-Paginierung

Es ist völlig in Ordnung, ObjectId() zu verwenden, obwohl Ihre Syntax für die Paginierung falsch ist. Sie wollen:

 db.tweets.find().limit(50).sort({"_id":-1});

Dies besagt, dass Sie Tweets nach _id sortiert haben möchten Wert in absteigender Reihenfolge und Sie möchten die letzten 50. Ihr Problem ist die Tatsache, dass die Paginierung schwierig ist, wenn sich die aktuelle Ergebnismenge ändert. Anstatt also skip für die nächste Seite zu verwenden, möchten Sie den kleinsten _id in der Ergebnismenge (die 50. neuste _id Wert und holen Sie sich dann die nächste Seite mit:

 db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});

Dadurch erhalten Sie die nächsten "neuesten" Tweets, ohne dass neu eingehende Tweets Ihre Paginierung durch die Zeit durcheinander bringen.

Es besteht absolut kein Grund zur Sorge, ob _id Der Wert entspricht genau der Reihenfolge der Einfügungen - er wird zu 99,999 % nahe genug sein, und niemand kümmert sich im Sekundentakt darum, welcher Tweet zuerst kam - Sie werden vielleicht sogar bemerken, dass Twitter häufig Tweets in falscher Reihenfolge anzeigt, es ist einfach nicht so wichtig.

Wenn es ist kritisch, dann müssten Sie die gleiche Technik verwenden, aber mit "Tweet-Datum", wo dieses Datum ein Zeitstempel sein müsste und nicht nur ein Datum.