Używanie ObjectId() jest w porządku, chociaż twoja składnia dla stronicowania jest nieprawidłowa. Chcesz:
db.tweets.find().limit(50).sort({"_id":-1});
Oznacza to, że chcesz, aby tweety były sortowane według _id
wartość w kolejności malejącej i chcesz mieć najnowsze 50. Twoim problemem jest fakt, że stronicowanie jest trudne, gdy bieżący zestaw wyników się zmienia - więc zamiast używać pomijania dla następnej strony, chcesz zanotować najmniejszy _id
w zestawie wyników (50. najnowszy _id
wartość, a następnie przejdź do następnej strony z:
db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});
Dzięki temu otrzymasz kolejne „najnowsze” tweety, bez nowych przychodzących tweetów, które zepsują twoją paginację w czasie.
Absolutnie nie musisz się martwić, czy _id
wartość ściśle odpowiada zamówieniu reklamowemu – będzie wystarczająco blisko 99,999% i nikogo nie obchodzi, który tweet był pierwszy – możesz nawet zauważyć, że Twitter często wyświetla tweety niewłaściwie, po prostu nie jest to tak istotne.
Jeśli jest krytyczne, wtedy musiałbyś użyć tej samej techniki, ale z „datą tweet”, gdzie ta data musiałaby być znacznikiem czasu, a nie tylko datą.