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

MongoDB $ifNull

Dans MongoDB, $ifNull est un opérateur de pipeline d'agrégation qui vous permet de spécifier une valeur à utiliser à la place de null .

La façon dont cela fonctionne est que vous fournissez une expression et une expression de remplacement. Si l'expression donne une valeur non nulle, cette expression est renvoyée. Mais si l'expression est évaluée à une valeur nulle, $ifNull renvoie la valeur de l'expression de remplacement.

Une valeur nulle inclut des instances de valeurs indéfinies ou de champs manquants.

Exemple

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

{ "_id" : 1, "data" : 250 }
{ "_id" : 2, "data" : -250 }
{ "_id" : 3, "data" : "Bucket" }
{ "_id" : 4, "data" : 0 }
{ "_id" : 5, "data" : ISODate("2021-01-03T23:30:15.100Z") }
{ "_id" : 6, "data" : null }
{ "_id" : 7, "data" : Infinity }
{ "_id" : 8, "data" : -Infinity }

Voici ce qui se passe si nous utilisons le $ifNull opérateur sur les data champ :

db.test.aggregate(
   [
     {
       $project:
          {
            result: { $ifNull: [ "$data", "Value not provided" ] }
          }
     }
   ]
)

Résultat :

{ "_id" : 1, "result" : 250 }
{ "_id" : 2, "result" : -250 }
{ "_id" : 3, "result" : "Bucket" }
{ "_id" : 4, "result" : 0 }
{ "_id" : 5, "result" : ISODate("2021-01-03T23:30:15.100Z") }
{ "_id" : 6, "result" : "Value not provided" }
{ "_id" : 7, "result" : Infinity }
{ "_id" : 8, "result" : -Infinity }

Nous pouvons voir qu'un seul champ avait une valeur nulle et c'est donc le seul qui a renvoyé "Value not provided" .

Champs non définis et manquants

Comme mentionné, les valeurs indéfinies et les champs manquants sont traités comme des valeurs nulles.

Supposons que nous ajoutions les documents suivants à notre collection :

{ "_id" : 9, "data" : undefined }
{ "_id" : 10, "name" : "Homer" }

Dans ce cas, le document 9 a undefined dans le champ de données, mais le document 10 n'a même pas de data champ.

Voici ce qui se passe lorsque nous appliquons $ifNull à ces documents :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 9, 10 ] } } },
     {
       $project:
          {
            result: { $ifNull: [ "$data", "Value not provided" ] }
          }
     }
   ]
)

Résultat :

{ "_id" : 9, "result" : "Value not provided" }
{ "_id" : 10, "result" : "Value not provided" }