134 votes

Comment MongoDB trie-t-il les enregistrements lorsqu'aucun ordre de tri n'est spécifié ?

Lorsque nous exécutons une requête Mongo find() sans spécifier d'ordre de tri, que la base de données utilise-t-elle en interne pour trier les résultats ?

Selon le documentation sur le site web de mongo :

Lors de l'exécution d'un find() sans paramètres, la base de données renvoie les objets dans l'ordre naturel avant.

Pour les tableaux standards, l'ordre naturel n'est pas particulièrement utile car, car, bien que l'ordre soit souvent proche de l'ordre d'insertion, il n'est pas garanti qu'il le soit. garanti. Cependant, pour les collections plafonnées, l'ordre naturel est est garanti comme étant l'ordre d'insertion. Cela peut être très utile.

Cependant, pour les collections standard (collections non plafonnées), quel champ est utilisé pour trier les résultats ? Est-ce le _id ou autre chose ?

Edit :

En gros, je suppose que ce que j'essaie d'obtenir, c'est que si j'exécute la requête de recherche suivante :

db.collection.find({"x":y}).skip(10000).limit(1000);

A deux moments différents dans le temps : t1 y t2 J'obtiendrai des résultats différents :

  1. Lorsqu'il n'y a pas eu d'écritures supplémentaires entre t1 et t2 ?
  2. Quand il y a eu de nouvelles écritures entre t1 & t2 ?
  3. Il y a de nouveaux index qui ont été ajoutés entre t1 & t2 ?

J'ai effectué quelques tests sur une base de données temporaire et les résultats que j'ai obtenus sont les mêmes ( Oui ) pour les 3 cas - mais je voulais être sûr et je suis certain que mes cas de test n'étaient pas très complets.

147voto

Stennie Points 19196

Quel est l'ordre de tri par défaut lorsqu'aucun ordre n'est spécifié ?

L'ordre de tri interne par défaut (ou ordre naturel ) est un indéfini détail de la mise en œuvre. Le maintien de l'ordre est une charge supplémentaire pour les moteurs de stockage et l'API de MongoDB n'impose pas la prévisibilité en dehors d'un processus explicite de gestion de l'ordre. sort() ou le cas particulier de la taille fixe collections plafonnées qui sont associés restrictions d'utilisation . Pour les charges de travail typiques, il est souhaitable que le moteur de stockage essaie de réutiliser l'espace préalloué disponible et prenne des décisions sur la manière la plus efficace de stocker les données sur le disque et en mémoire.

Sans aucun critère de requête, les résultats seront renvoyés par le moteur de stockage en format ordre naturel (alias dans l'ordre où ils se trouvent ). L'ordre des résultats peut coïncider avec l'ordre d'insertion, mais ce comportement n'est pas garanti et on ne peut s'y fier (sauf pour les collections plafonnées).

Quelques exemples qui peuvent affecter l'ordre (naturel) de stockage :

  • WiredTiger utilise une représentation différente des documents sur le disque et dans le cache en mémoire. L'ordre naturel peut donc changer en fonction des structures de données internes.
  • Le moteur de stockage original MMAPv1 (supprimé dans MongoDB 4.2) alloue un espace d'enregistrement pour les documents en fonction de règles de remplissage. Si un document dépasse l'espace d'enregistrement actuellement alloué, l'emplacement du document (et l'ordre naturel) sera affecté. De nouveaux documents peuvent également être insérés dans le stockage marqué disponible pour la réutilisation en raison de documents supprimés ou déplacés.
  • La réplication utilise un oplogue idempotent pour appliquer les opérations d'écriture de manière cohérente entre les membres de l'ensemble de répliques. Chaque membre de l'ensemble de répliques maintient des fichiers de données locaux qui peuvent varier dans l'ordre naturel, mais qui auront le même résultat de données lorsque les mises à jour oplog sont appliquées.

Que se passe-t-il si un index est utilisé ?

Si un index est utilisé, les documents seront renvoyés dans l'ordre où ils sont trouvés (ce qui ne correspond pas nécessairement à l'ordre d'insertion ou à l'ordre d'entrée/sortie). Si plus d'un index est utilisé, l'ordre dépend en interne de l'index qui a identifié le document en premier lors du processus de déduplication.

Si vous voulez un ordre de tri prévisible, vous doit inclure une explic explicite sort() avec votre requête et avoir des valeurs uniques pour votre clé de tri.

Comment les collections plafonnées maintiennent-elles l'ordre d'insertion ?

L'exception de mise en œuvre notée pour l'ordre naturel dans les collections plafonnées est appliquée par les restrictions d'utilisation spéciales : les documents sont stockés dans l'ordre d'insertion mais la taille du document existant ne peut pas être augmentée et les documents ne peuvent pas être explicitement supprimés. L'ordre fait partie de la conception de la collection plafonnée qui garantit que les documents les plus anciens "vieillissent" en premier.

10voto

parvin Points 8064

Ils sont retournés dans l'ordre stocké (ordre dans le fichier), mais il n'est pas garanti qu'ils soient dans l'ordre inséré. Ils ne sont pas triés par le champ _id. Parfois, on peut avoir l'impression qu'ils sont triés par ordre d'insertion, mais cela peut changer dans une autre requête. Ce n'est pas fiable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X