En MongoDB, $ifNull es un operador de tubería de agregación que le permite especificar un valor para usar en lugar de null .
La forma en que funciona es que proporciona una expresión y una expresión de reemplazo. Si la expresión se evalúa como un valor no nulo, se devuelve esa expresión. Pero si la expresión se evalúa como un valor nulo, $ifNull devuelve el valor de la expresión de reemplazo.
Un valor nulo incluye instancias de valores indefinidos o campos faltantes.
Ejemplo
Supongamos que tenemos una colección llamada test con los siguientes documentos:
{ "_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 }
Esto es lo que sucede si usamos $ifNull operador en los data campo:
db.test.aggregate(
[
{
$project:
{
result: { $ifNull: [ "$data", "Value not provided" ] }
}
}
]
) Resultado:
{ "_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 }
Podemos ver que solo un campo tenía un valor nulo y por lo tanto, era el único que devolvía "Value not provided" .
Campos indefinidos y faltantes
Como se mencionó, los valores indefinidos y los campos faltantes se tratan como valores nulos.
Supongamos que agregamos los siguientes documentos a nuestra colección:
{ "_id" : 9, "data" : undefined }
{ "_id" : 10, "name" : "Homer" }
En este caso, el documento 9 tiene undefined en el campo de datos, pero el documento 10 ni siquiera tiene un data campo.
Esto es lo que sucede cuando aplicamos $ifNull a esos documentos:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 9, 10 ] } } },
{
$project:
{
result: { $ifNull: [ "$data", "Value not provided" ] }
}
}
]
) Resultado:
{ "_id" : 9, "result" : "Value not provided" }
{ "_id" : 10, "result" : "Value not provided" }