Напълно добре е да използвате ObjectId(), въпреки че синтаксисът ви за пагинация е грешен. Искате:
db.tweets.find().limit(50).sort({"_id":-1});
Това казва, че искате туитове, сортирани по _id
стойност в низходящ ред и искате най-новите 50. Вашият проблем е фактът, че пагинацията е трудна, когато текущият набор от резултати се променя - така че вместо да използвате пропускане за следващата страница, искате да отбележите най-малкия _id
в набора от резултати (50-тият най-нов _id
стойност и след това вземете следващата страница с:
db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});
Това ще ви даде следващите „най-скорошни“ туитове, без нови входящи туитове да объркат пагинацията ви назад във времето.
Няма абсолютно никаква нужда да се притеснявате дали _id
стойността стриктно съответства на реда на вмъкване - ще бъде 99,999% достатъчно близо и никой всъщност не се интересува на под-второ ниво кой туит е първи - може дори да забележите, че Twitter често показва туитове в нередност, просто не е толкова критично.
Ако е е критично, тогава ще трябва да използвате същата техника, но с „дата на туит“, където тази дата трябва да бъде времеви печат, а не просто дата.