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

Comment MongoDB classe-t-il ses documents dans une seule collection ?

C'est ce qu'on appelle l'ordre naturel :

natural order

L'ordre dans lequel la base de données fait référence aux documents sur le disque. Il s'agit de l'ordre de tri par défaut. Voir $natural et Return in Natural Order .

Cela confirme qu'en général, vous les obtenez dans le même ordre que celui que vous avez inséré, mais ce n'est pas garanti, comme vous l'avez remarqué.

Retour dans l'ordre naturel

Le $natural Le paramètre renvoie les éléments selon leur ordre naturel dans la base de données. Cette commande est une fonctionnalité de mise en œuvre interne, et vous ne devez pas vous fier à une structure particulière en son sein.

Utilisation de l'index

Requêtes incluant un tri par $natural commande ne pas utiliser des index pour remplir le prédicat de la requête avec l'exception suivante :si le prédicat de la requête est une condition d'égalité sur le _id champ { _id: <value> } , puis la requête avec le tri par $natural la commande peut utiliser le _id indice.

MMAPv1

En règle générale, l'ordre naturel reflète l'ordre d'insertion à 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 des documents ou si les opérations de suppression libèrent de l'espace qui est ensuite occupé par les documents nouvellement insérés.

De toute évidence, comme les documents mentionnés, vous ne devriez pas s'appuyer sur cet ordre par défaut (Cet ordre est une fonctionnalité d'implémentation interne, et vous ne devez pas vous fier à une structure particulière en son sein. ).

Si vous avez besoin de trier les choses, utilisez les solutions de tri.

Fondamentalement, les deux appels suivants doivent renvoyer des documents dans le même ordre (puisque l'ordre par défaut est $natural ):

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

Si vous voulez trier par un autre champ (par exemple name ) vous pouvez le faire :

db.mycollection.find().sort({ "name": 1 })