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 retourscore
. Nous avons ensuite fait référence à cette variable dans lecond
champ utilisant$$score
. Comme mentionné, vous pouvez omettre leas
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:1Valeurs nulles
Si le champ contient
null
au lieu d'un tableau, le résultat estnull
.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
auxscores
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 donnenull
ê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 estthis
.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
.