MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Requête de plage pour la pagination MongoDB

Il est parfaitement correct d'utiliser ObjectId() bien que votre syntaxe de pagination soit erronée. Vous voulez :

 db.tweets.find().limit(50).sort({"_id":-1});

Cela signifie que vous voulez que les tweets soient triés par _id valeur dans l'ordre décroissant et vous voulez les 50 plus récents. Votre problème est le fait que la pagination est délicate lorsque le jeu de résultats actuel change - donc plutôt que d'utiliser le saut pour la page suivante, vous voulez noter le plus petit _id dans le jeu de résultats (le 50e _id le plus récent valeur puis obtenir la page suivante avec :

 db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});

Cela vous donnera les prochains tweets "les plus récents", sans que les nouveaux tweets entrants ne perturbent votre pagination dans le temps.

Il n'y a absolument aucun besoin de s'inquiéter de savoir si _id la valeur correspond strictement à l'ordre d'insertion - elle sera suffisamment proche à 99,999 %, et personne ne se soucie réellement au niveau inférieur du tweet qui est arrivé en premier - vous remarquerez peut-être même que Twitter affiche fréquemment des tweets dans le désordre, ce n'est tout simplement pas si critique.

Si c'est l'est critique, vous devrez alors utiliser la même technique mais avec une "date de tweet" où cette date devra être un horodatage, plutôt qu'une simple date.