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

MongoDB $ filtre

Dans MongoDB, le $filter l'opérateur de pipeline d'agrégation renvoie un sous-ensemble d'un tableau en fonction d'une condition spécifiée.

Le $filter renvoie un tableau contenant uniquement les éléments qui correspondent à la condition, dans leur ordre d'origine.

Syntaxe

La syntaxe ressemble à ceci :

{ $filter: { input: <array>, as: <string>, cond: <expression> } } 

Chaque champ est expliqué ci-dessous.

Champ Spécification
input Une expression qui se résout en un tableau.
as Ceci est un champ facultatif. Il spécifie un nom pour la variable qui représente chaque élément individuel de l'input déployer. Si aucun nom n'est spécifié (c'est-à-dire si vous omettez ce champ), le nom de la variable par défaut est this .
cond Une expression qui se résout en une valeur booléenne utilisée pour déterminer si un élément doit être inclus dans le tableau de sortie. L'expression fait référence à chaque élément de input tableau individuellement avec le nom de variable spécifié dans as .

Exemple

Supposons que nous ayons une collection appelée players avec les documents suivants

{ "_id" :1, "player" :"Homer", "scores" :[ 1, 5, 3 ] }{ "_id" :2, "player" :"Marge", "scores" :[ 8, 17, 18 ] }{ "_id" :3, "player" :"Bart", "scores" :[ 15, 11, 8 ] }

Voici un exemple d'application du $filter opérateur pour filtrer les éléments du tableau dans les scores champ :

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 1, 2, 3 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              as: "score",
              cond: { $gt: [ "$$score", 10 ] }
          }
        }
    }
  }
]) 

Résultat :

{ "_id" :1, "highScores" :[ ] }{ "_id" :2, "highScores" :[ 17, 18 ] }{ "_id" :3, "highScores" :[ 15, 11 ] } 

Dans cet exemple, nous avons filtré les tableaux uniquement sur les éléments dont la valeur est supérieure à 10. Seules ces valeurs sont renvoyées.

Toutes les valeurs inférieures à 10 sont omises du résultat. Dans le cas du premier document, cela se traduit par un tableau vide.

Ici, nous avons utilisé le as champ pour nommer la variable de retour score . Nous avons ensuite fait référence à cette variable dans le cond champ utilisant $$score . Comme mentionné, vous pouvez omettre le as champ, puis faites référence à la variable de retour en utilisant $$this . Plus d'informations à ce sujet plus tard.

Tableaux vides

Si le tableau est vide, alors un tableau vide est retourné.

Supposons que nous ayons le document suivant dans notre collection :

{ "_id" :4, "player" :"Farnsworth", "scores" :[ ] }

Voici ce qui se passe lorsque nous appliquons $filter à ce tableau :

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 4 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              as: "score",
              cond: { $gt: [ "$$score", 10 ] }
          }
        }
    }
  }
]) 

Résultat :

{ "_id" :4, "highScores" :[ ] }

Mauvais type

Application de $filter à un champ qui ne contient pas de tableau renvoie une erreur.

Exemple :

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 4 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$player",
              as: "player",
              cond: { $gt: [ "$$player", 10 ] }
          }
        }
    }
  }
]) 

Résultat :

Erreur :échec de la commande :{ "ok" :0, "errmsg" :"l'entrée dans $filter doit être un tableau et non une chaîne", "code" :28651, "codeName" :"Location28651"} :échec de l'agrégat :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:618:17example@ sqldat.com/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1046:12@(shell ):1:1

Valeurs nulles

Si le champ contient null au lieu d'un tableau, le résultat est null .

Imaginons que nous ayons le document suivant dans la collection :

{ "_id" :5, "player" :"Meg", "scores" :null }

Voici ce qui se passe lorsque nous appliquons $filter aux scores champ :

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 5 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              as: "score",
              cond: { $gt: [ "$$score", 10 ] }
          }
        }
    }
  }
]) 

Résultat :

{ "_id" :5, "highScores" :null }

Champ inexistant

Application de $filter à un champ qui n'existe pas donne null être retourné.

Exemple :

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 5 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$name",
              as: "name",
              cond: { $gt: [ "$$name", 10 ] }
          }
        }
    }
  }
]) 

Résultat :

{ "_id" :5, "highScores" :null }

Le nom de la variable est facultatif

Dans les exemples précédents, j'utilise le as champ pour attribuer un nom à la variable.

Comme mentionné, le as champ est facultatif. Si vous omettez ce champ, le nom de la variable par défaut est this .

Voici un exemple :

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 1, 2, 3 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              cond: { $gt: [ "$$this", 10 ] }
          }
        }
    }
  }
])
 

Résultat :

{ "_id" :1, "highScores" :[ ] }{ "_id" :2, "highScores" :[ 17, 18 ] }{ "_id" :3, "highScores" :[ 15, 11 ] } 

C'est la même chose que le premier exemple, sauf que dans cet exemple, nous omettons le as champ, et donc faire référence à la variable en utilisant $$this .