Quel est l'ordre de tri par défaut lorsqu'aucun n'est spécifié ?
L'ordre de tri interne par défaut (ou ordre naturel) est un indéfini détail de mise en œuvre. Le maintien de l'ordre est une surcharge supplémentaire pour les moteurs de stockage et l'API de MongoDB n'impose pas de prévisibilité en dehors d'un sort()
explicite ou le cas particulier des collections plafonnées à taille fixe qui ont des restrictions d'utilisation associées. 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 de stocker le plus efficacement les données sur disque et en mémoire.
Sans aucun critère de requête, les résultats seront renvoyés par le moteur de stockage dans l'ordre naturel (c'est-à-dire dans l'ordre dans lequel ils sont trouvés ). L'ordre des résultats peut coïncider avec l'ordre d'insertion, mais ce comportement n'est pas garanti et ne peut pas être invoqué (à l'exception des collections plafonnées).
Quelques exemples pouvant affecter l'ordre de stockage (naturel) :
- WiredTiger utilise une représentation différente des documents sur disque par rapport au cache en mémoire, de sorte que l'ordre naturel peut changer en fonction des structures de données internes.
- Le moteur de stockage MMAPv1 d'origine (supprimé dans MongoDB 4.2) alloue de l'espace d'enregistrement pour les documents en fonction des règles de remplissage. Si un document dépasse l'espace d'enregistrement actuellement alloué, l'emplacement du document (et l'ordre naturel) en sera affecté. De nouveaux documents peuvent également être insérés dans le stockage marqué comme disponible pour réutilisation en raison de documents supprimés ou déplacés.
- La réplication utilise un format oplog idempotent pour appliquer les opérations d'écriture de manière cohérente sur les membres du jeu de réplicas. Chaque membre du jeu de réplicas conserve des fichiers de données locaux qui peuvent varier dans l'ordre naturel, mais auront le même résultat de données lorsque les mises à jour oplog sont appliquées.
Et si un index est utilisé ?
Si un index est utilisé, les documents seront retournés dans l'ordre où ils sont trouvés (ce qui correspond nécessairement à l'ordre d'insertion ou à l'ordre d'E/S). Si plusieurs index sont utilisés, 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 devez inclure un sort()
explicite 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 d'implémentation notée pour l'ordre naturel dans les collections limitées est appliquée par leurs 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. La commande fait partie de la conception de la collection limitée qui garantit que les documents les plus anciens « vieillissent » en premier.