Dans MongoDB, le cursor.sort()
spécifie l'ordre dans lequel la requête renvoie les documents correspondants.
Le sort()
La méthode accepte un document qui spécifie le champ à trier et l'ordre de tri. L'ordre de tri peut être soit 1
pour croissant ou -1
pour descendre.
Vous pouvez également spécifier { $meta: "textScore" }
en faisant $text
recherches, afin de trier par le textScore
calculé métadonnées par ordre décroissant.
Exemple de données
Supposons que nous ayons une collection appelée pets
avec les documents suivants :
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
Trier par ordre croissant
Pour trier par ordre croissant, nous utilisons 1
pour l'ordre de tri.
Ci-dessous un exemple de requête qui utilise le $sort
opérateur pour trier cette collection par le weight
champ par ordre croissant.
db.pets.find().sort({ weight: 1 })
Résultat :
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
Trier par ordre décroissant
Pour trier par ordre décroissant, nous utilisons -1
pour l'ordre de tri.
db.pets.find().sort({ weight: -1 })
Résultat :
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Trier par plusieurs champs
Pour trier sur plusieurs champs, séparez chaque combo champ/ordre de tri par une virgule.
Exemple
db.pets.find().sort({ type: 1, weight: -1, _id: 1 })
Résultat :
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
Dans cet exemple, nous avons trié par le type
champ dans l'ordre croissant d'abord, puis par le weight
champ par ordre décroissant, puis par le _id
champ par ordre croissant.
Cela signifie que, s'il y a plusieurs animaux du même type, ces animaux sont triés par leur weight
par ordre décroissant. S'il y a plusieurs animaux avec le même type et le même poids, alors ces animaux sont triés par le _id
champ par ordre croissant. Si nous n'avions pas inclus le _id
champ dans le processus de tri, ces animaux du même type et du même poids pourraient apparaître dans n'importe quel ordre. Cela est vrai à chaque fois que nous exécutons la requête. Sans avoir un champ de tri sur un champ unique (comme le _id
champ), il serait tout à fait possible (voire probable) que les résultats reviennent dans un ordre différent à chaque exécution de la requête.
Trier différents types
Lors de la comparaison des valeurs de différents types de BSON, MongoDB utilise l'ordre de comparaison suivant, du plus bas au plus élevé :
- MinKey (type interne)
- Nul
- Nombres (entiers, longs, doubles, décimaux)
- Symbole, Chaîne
- Objet
- Tableau
- BinData
- ObjectId
- Booléen
- Date
- Horodatage
- Expression régulière
- MaxKey (type interne)
Supposons que nous ayons une collection appelée posts avec les documents suivants :
{ "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") }
Notez que la première date
contient une chaîne de date, alors que les deux autres documents utilisent un objet Date.
Notez également que la chaîne de date contient exactement la même date que le document 3 et que cette date est postérieure à la date du document 2.
Trions par date
champs de ces documents :
db.posts.find().sort({ date: 1 }).pretty()
Résultat :
{ "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") }
Dans ce cas, nous avons trié par ordre croissant, ce qui signifie que les dates les plus anciennes doivent venir en premier. Cependant, notre premier document contient une chaîne de date au lieu d'un objet Date, et il est donc venu en premier - même si sa date est postérieure à la date du document 2.
La voici à nouveau, mais dans l'ordre décroissant :
db.posts.find().sort({ date: -1 }).pretty()
Résultat :
{ "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
Encore une fois, les différents types de données sont classés séparément en eux-mêmes.
Trier les métadonnées de score de texte
Vous pouvez utiliser le { $meta: "textScore" }
argument pour trier par score de pertinence décroissant lors de l'utilisation de $text
recherches.
Exemple
db.posts.find(
{ $text: { $search: "funny" } },
{ score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" } }
).pretty()
Résultat :
{ "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z"), "score" : 0.6666666666666666 } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z"), "score" : 0.6 } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z", "score" : 0.5833333333333334 }
Dans cet exemple, nous avons trié par { $meta: "textScore" }
.
Depuis MongoDB 4.4, la ligne qui va { score: { $meta: "textScore" }}
est facultatif. Omettre ceci omettra le score
champ à partir des résultats. Par conséquent, nous pouvons faire ce qui suit (à partir de MongoDB 4.4) :
db.posts.find(
{ $text: { $search: "funny" } }
).sort({ score: { $meta: "textScore" } }
).pretty()
Résultat :
{ "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
Faire $text
des recherches comme celle-ci nécessitent que nous ayons créé un index de texte. Sinon, un IndexNotFound
l'erreur sera renvoyée.
Plus d'informations
Consultez la documentation MongoDB pour plus d'informations.