web-dev-qa-db-fra.com

Comment MongoDB commande-t-il ses documents dans une collection?

Dans ma User collection, MongoDB commande généralement chaque nouveau document dans le même ordre que je les crée: le dernier créé est le dernier de la collection. Mais j'ai détecté une autre collection où le dernier que j'ai créé a la position 6 entre 27 documents. 

Pourquoi donc?

Quel ordre suit chaque document dans la collection MongoDB?

16
Paola G

Je pourrais en savoir plus à ce sujet grâce au lien Retour en ordre naturel fourni par Ionică Bizău

"Le paramètre $ natural renvoie les éléments en fonction de leur ordre naturel dans la base de données .Cet ordre est une fonctionnalité d’implémentation interne, vous ne devez donc vous fier à aucune de ses structures.} _

En règle générale, l'ordre naturel reflète l'ordre d'insertion avec l'exception suivante pour le moteur de stockage MMAPv1. Pour le moteur de stockage MMAPv1, l'ordre naturel ne reflète pas l'ordre d'insertion si les documents sont déplacés en raison de la croissance du document ou si des opérations de suppression suppriment de l'espace qui est ensuite utilisé par les nouveaux documents insérés. "

2
Paola G

MongoDB ne "commande" pas du tout les documents, à moins que vous ne le lui demandiez.

L'insertion de base crée un ObjectId dans la valeur de la clé primaire _id, sauf indication contraire de votre part. Cette valeur ObjectId est une valeur spéciale avec les propriétés "monotones" ou "croissantes", ce qui signifie que chaque valeur créée est garantie plus grande que la précédente.

Si vous voulez "trier", faites un "tri" explicite:

 db.collection.find().sort({ "_id": 1 })

Ou un "naturel" sort signifie dans l'ordre stocké sur le disque:

db.collection.find().sort({ "$natural": 1 })

Ce qui est à peu près la norme sauf indication contraire ou un "index" est sélectionné par les critères de requête qui détermineront l'ordre de tri. Mais vous pouvez utiliser cela pour "forcer" cet ordre si les critères de requête sélectionnaient un index trié autrement.

Les documents MongoDB "bougent" une fois développés, et donc l'ordre _id n'est pas toujours explicitement le même que celui dans lequel les documents sont récupérés.

2
Blakes Seven

Pour des raisons de performances, MongoDB ne divise jamais un document sur le disque dur.

Lorsque vous commencez avec une collection vide et commencez à insérer un document après l'autre, mongoDB les placera de manière consécutive sur le disque.

Mais que se passe-t-il lorsque vous mettez à jour un document et que celui-ci prend maintenant plus de place et ne correspond plus à son ancienne position sans chevaucher le suivant? Dans ce cas, MongoDB le supprimera et le rajoutera en tant que nouveau à la fin du fichier de collection.

Votre fichier de collection a maintenant un trou d’espace inutilisé. C'est un gaspillage, n'est-ce pas? C'est pourquoi le prochain document inséré et suffisamment petit pour tenir dans ce trou sera inséré dans ce dernier. C'est probablement ce qui s'est passé dans le cas de votre deuxième collection.

Résultat final: Ne vous fiez jamais aux documents retournés dans l'ordre d'insertion. Lorsque vous vous souciez de l'ordre, triez toujours vos résultats.

1
Philipp