Je naprosto v pořádku použít ObjectId(), ačkoli vaše syntaxe pro stránkování je nesprávná. Chcete:
db.tweets.find().limit(50).sort({"_id":-1});
To říká, že chcete tweety seřadit podle _id
hodnotu v sestupném pořadí a chcete nejnovějších 50. Váš problém je ve skutečnosti, že stránkování je složité, když se aktuální sada výsledků mění - takže místo použití přeskočení na další stránku si chcete poznamenat nejmenší _id
ve výsledkové sadě (50. nejnovější _id
hodnotu a poté získat další stránku s:
db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});
Získáte tak další „nejnovější“ tweety, aniž by nové příchozí tweety narušily vaše stránkování v čase.
Není absolutně nutné se starat o to, zda _id
hodnota přesně odpovídá objednávce vložení – bude to z 99,999 % dostatečně blízko a nikoho ve skutečnosti na nižší úrovni nezajímá, který tweet přišel jako první – můžete si dokonce všimnout, že Twitter často zobrazuje tweety mimo pořadí, jen to není tak kritické.
Pokud je kritické, pak byste museli použít stejnou techniku, ale s „datem tweetu“, kde by toto datum muselo být spíše časovým razítkem než pouhým datem.