Va benissimo usare ObjectId() anche se la tua sintassi per l'impaginazione è sbagliata. Vuoi:
db.tweets.find().limit(50).sort({"_id":-1});
Questo dice che vuoi che i tweet siano ordinati per _id
valore in ordine decrescente e vuoi il 50 più recente. Il tuo problema è il fatto che l'impaginazione è complicata quando il set di risultati corrente cambia, quindi invece di usare skip per la pagina successiva, vuoi prendere nota del _id
nel set di risultati (il cinquantesimo _id
più recente valore e quindi ottenere la pagina successiva con:
db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});
Questo ti darà i prossimi tweet "più recenti", senza che i nuovi tweet in arrivo rovinino la tua paginazione indietro nel tempo.
Non c'è assolutamente bisogno di preoccuparsi se _id
il valore è strettamente corrispondente all'ordine di inserimento:sarà abbastanza vicino al 99,999% e a nessuno importa al livello inferiore del secondo quale tweet sia arrivato per primo:potresti anche notare che Twitter mostra spesso i tweet fuori ordine, ma non è così critico.
Se lo è critico, dovresti usare la stessa tecnica ma con "data del tweet" in cui quella data dovrebbe essere un timestamp, piuttosto che solo una data.