Det går alldeles utmärkt att använda ObjectId() även om din syntax för sidnumrering är fel. Du vill:
db.tweets.find().limit(50).sort({"_id":-1});
Detta säger att du vill ha tweets sorterade efter _id
värde i fallande ordning och du vill ha den senaste 50. Ditt problem är det faktum att sidnumrering är knepigt när den aktuella resultatuppsättningen ändras - så istället för att använda hoppa över för nästa sida, vill du anteckna den minsta _id
värde och få nästa sida med:
db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});
Detta kommer att ge dig nästa "senaste" tweets, utan att nya inkommande tweets förstör din paginering bakåt i tiden.
Det finns absolut ingen anledning att oroa sig för om _id
värdet motsvarar strikt insättningsordningen - det kommer att vara 99,999% tillräckligt nära, och ingen bryr sig faktiskt på den sekundära nivån vilken tweet som kom först - du kanske till och med märker att Twitter ofta visar tweets i oordning, det är bara inte så kritiskt.
Om det är kritiskt, då måste du använda samma teknik men med "tweet-datum" där det datumet måste vara en tidsstämpel, snarare än bara ett datum.