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

Tri MongoDB()

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é :

  1. MinKey (type interne)
  2. Nul
  3. Nombres (entiers, longs, doubles, décimaux)
  4. Symbole, Chaîne
  5. Objet
  6. Tableau
  7. BinData
  8. ObjectId
  9. Booléen
  10. Date
  11. Horodatage
  12. Expression régulière
  13. 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.