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

2 façons de limiter les documents retournés dans MongoDB

Lorsque vous exécutez des requêtes dans MongoDB, vous avez la possibilité de limiter les documents renvoyés. C'est ici que vous spécifiez un nombre maximum de documents à renvoyer par l'opération.

Par exemple, si une opération renvoie normalement 2 000 documents, mais que vous spécifiez une limite de 1 000, seuls 1 000 documents sont renvoyés. Cependant, si l'opération ne renvoie que 500 documents, les 500 documents sont tous renvoyés (car ils ne dépassent pas la limite de 1 000 documents).

C'est un peu comme utiliser le TOP clause dans SQL Server, ou la LIMIT clause dans MySQL, MariaDB, PostgreSQL et SQLite.

Limiter le nombre de documents renvoyés peut aider à améliorer les performances en empêchant que plus de documents soient renvoyés et traités que nécessaire.

Dans MongoDB, nous pouvons utiliser le cursor.limit() ou la méthode $limit opérateur d'agrégation pour limiter les documents retournés.

Le cursor.limit() Méthode

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" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }

Nous pouvons utiliser le limit() méthode pour limiter le nombre de documents renvoyés lors de l'interrogation de cette collection.

Exemple :

db.pets.find().limit(3)

Résultat :

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

La $limit Opérateur d'agrégation

Lorsque vous utilisez le pipeline d'agrégation, vous pouvez utiliser le $limit opérateur d'agrégation pour limiter les résultats transmis à l'étape suivante du pipeline.

Exemple :

db.pets.aggregate([
    {
      $match: { }
    },
     { 
      $limit : 3
    }
])

Exemple :

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Typiquement, le $match L'opérateur ne consisterait pas en un document vide comme nous l'avons ici. Il inclurait normalement une requête avec laquelle filtrer les résultats à cette partie du pipeline. Mais dans ce cas, j'ai utilisé un document vide afin de rendre l'exemple plus facile à suivre.

Étant donné que j'ai passé un document vide à la première étape, j'aurais pu faire ceci :

db.pets.aggregate([
     { 
      $limit : 3
    }
])

Quoi qu'il en soit, le résultat était limité à seulement 3 documents.

Lorsqu'il est utilisé dans le pipeline d'agrégation, le $limit l'opérateur pourrait être quelque part au milieu du pipeline. Si c'est le cas, il passe les documents limités à l'étape suivante.

Voici un exemple pour illustrer ce que je veux dire.

db.pets.aggregate([
    {
      $match: { }
    },
     { 
      $limit : 3
    },
    {
      $match: { "type": "Cat" }
    }
])

Résultat :

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Un seul chat figurait dans les résultats limités (même s'il y a deux chats dans le document original), donc seul ce chat a été apparié à la troisième étape.

Ceci est différent de ce qui suit.

db.pets.aggregate([
    {
      $match: { "type": "Cat" }
    },
     { 
      $limit : 3
    }
])

Résultat :

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }

Dans ce cas, nous avons recherché des chats dans le document d'origine, puis limité les résultats à seulement 3. Étant donné qu'il n'y a que 2 chats, le $limit n'a eu aucun impact sur le résultat.

Limiter les documents triés

Si vous limitez les résultats après le tri des documents, alors la limite tiendra compte du tri.

Exemple :

db.pets.aggregate([
    {
      $sort: { "_id": -1 }
    },
     { 
      $limit : 3
    }
])

Résultat :

{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }

Dans ce cas, j'ai trié tous les documents par leur _id champ par ordre décroissant (le -1 spécifie l'ordre décroissant).

Le voici à nouveau dans l'ordre croissant (une valeur de 1 spécifie l'ordre croissant) :

db.pets.aggregate([
    {
      $sort: { "_id": 1 }
    },
     { 
      $limit : 3
    }
])

Résultat :

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Lorsque vous limitez les résultats après qu'ils ont été explicitement triés, assurez-vous que l'opération de tri a utilisé un tri stable.

Un tri stable est celui qui renvoie le même ordre de tri à chaque fois qu'il est exécuté. Un tri instable d'autre part, est celui qui peut renvoyer un ordre de tri différent lorsqu'il est effectué plusieurs fois.

Pour vous assurer que vous effectuez un tri stable, incluez au moins un champ dans votre tri qui contient exclusivement des valeurs uniques (par exemple, le _id champ).

Plus d'informations

Pour plus d'informations, consultez la documentation MongoDB pour :

  • cursor.limit()
  • $limit (agrégation)