Não há problema em usar ObjectId() embora sua sintaxe para paginação esteja errada. Você quer:
db.tweets.find().limit(50).sort({"_id":-1});
Isso diz que você quer os tweets classificados por
_id
valor em ordem decrescente e você deseja os 50 mais recentes. Seu problema é o fato de que a paginação é complicada quando o conjunto de resultados atual está mudando - então, em vez de usar pular para a próxima página, você deseja anotar o menor _id
no conjunto de resultados (o 50º _id
mais recente value e, em seguida, obter a próxima página com: db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});
Isso lhe dará os próximos tweets "mais recentes", sem novos tweets de entrada atrapalhando sua paginação no tempo.
Não há absolutamente nenhuma necessidade de se preocupar se
_id
O valor é estritamente correspondente à ordem de inserção - será 99,999% próximo o suficiente, e ninguém realmente se importa no nível sub-segundo qual tweet veio primeiro - você pode até notar que o Twitter frequentemente exibe tweets fora de ordem, mas não é tão crítico. Se é crítico, então você teria que usar a mesma técnica, mas com "data do tweet", onde essa data teria que ser um carimbo de data/hora, em vez de apenas uma data.