Dans MongoDB, vous pouvez utiliser le $exists
opérateur de requête d'élément pour faire correspondre les documents qui contiennent un champ spécifique.
Vous pouvez également l'utiliser pour faire correspondre des documents qui ne contiennent pas de champ spécifique.
Vous pouvez également l'utiliser en conjonction avec d'autres opérateurs tels que $nin
pour faire correspondre les documents où un champ donné existe, mais il ne contient pas de valeur spécifique.
Exemple
Supposons que nous ayons une collection appelée cats
qui contient les documents suivants :
{ "_id" :1, "name" :"Scratch", "born" :"mars 2020" }{ "_id" :2, "name" :"Meow", "weight" :30 }{ "_id" :3, "name" :"Fluffy", "height" :15 }{ "_id" :4, "name" :"Sox", "weight" :40 }{ "_id" :5, "name " :null, "weight" :20 }{ "_id" :6, "height" :20, "born" :ISODate("2021-01-03T23:30:15.123Z") }
Ces documents sont légèrement incohérents en ce qui concerne les champs dont ils disposent. Certains ont un weight
champ, les autres ont une height
champ, certains ont un born
champ, etc
Nous pouvons utiliser le $exists
opérateur pour renvoyer les documents de cette collection qui ont un champ spécifique.
Exemple :
db.cats.find( { weight: { $exists: true } } )
Résultat :
{ "_id" :2, "name" :"Meow", "weight" :30 }{ "_id" :4, "name" :"Sox", "weight" :40 }{ "_id" :5, "nom" : null, "poids" : 20 }
Nous pouvons voir que seuls les documents contenant un weight
champ sont renvoyés.
Champs contenant null
Le $exists
l'opérateur inclut les champs qui contiennent null
. Il ne fait pas de distinction entre null
et non null
valeurs.
Exemple :
db.cats.find( { name: { $exists: true } } )
Résultat :
{ "_id" :1, "name" :"Scratch", "born" :"mars 2020" }{ "_id" :2, "name" :"Meow", "weight" :30 }{ "_id" :3, "name" :"Fluffy", "height" :15 }{ "_id" :4, "name" :"Sox", "weight" :40 }{ "_id" :5, "name " :nul, "poids" :20 }
Nous pouvons voir que le document 5 a été renvoyé, même si son name
le champ est null
.
Existe sans valeur spécifique
Vous pouvez combiner $exists
avec d'autres opérateurs pour renvoyer les documents qui contiennent le champ, mais ce champ ne contient pas de valeur spécifique.
Exemple :
db.cats.find( { weight: { $exists: true, $nin: [20,30] } } )
Résultat :
{ "_id" :4, "name" :"Sox", "weight" :40 }
C'est un résultat différent de celui que nous aurions vu si nous avions simplement utilisé $nin
sans le $exists
opérateur.
Voici à quoi cela aurait ressemblé :
db.cats.find( { weight: { $nin: [20,30] } } )
Résultat :
{ "_id" :1, "name" :"Scratch", "born" :"mars 2020" }{ "_id" :3, "name" :"Fluffy", "height" :15 }{ "_id" :4, "name" :"Sox", "weight" :40 }{ "_id" :6, "height" :20, "born" :ISODate("2021-01-03T23:30:15.123Z ") }Documents ne contenant pas de champ spécifique
Vous pouvez utiliser
$exists: false
pour retourner des documents qui ne sont pas contenir le champ spécifié.Exemple :
db.cats.find( { name: { $exists: false } } )
Résultat :
{ "_id" :6, "height" :20, "born" :ISODate("2021-01-03T23:30:15.123Z") }Dans ce cas, un document de la collection ne contient pas le
name
champ.Vérifier plusieurs champs
Vous pouvez vérifier l'existence de plusieurs champs en les séparant par une virgule.
Exemple :
db.cats.find( { name: { $exists: true }, height: { $exists: true } } )
Résultat :
{ "_id" :3, "name" :"Fluffy", "height" :15 }Cet exemple renvoie tous les documents qui contiennent à la fois un
name
champ et uneheight
champ.