W MongoDB $ifNull
jest operatorem potoku agregacji, który umożliwia określenie wartości do użycia zamiast null
.
Sposób, w jaki to działa, polega na podaniu wyrażenia i wyrażenia zastępczego. Jeśli wynikiem wyrażenia jest wartość różna od null, to wyrażenie jest zwracane. Ale jeśli wynikiem wyrażenia jest wartość null, $ifNull
zwraca wartość wyrażenia zastępującego.
Wartość null obejmuje wystąpienia niezdefiniowanych wartości lub brakujących pól.
Przykład
Załóżmy, że mamy kolekcję o nazwie test
z następującymi dokumentami:
{ "_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 }
Oto, co się stanie, jeśli użyjemy $ifNull
operator na data
pole:
db.test.aggregate(
[
{
$project:
{
result: { $ifNull: [ "$data", "Value not provided" ] }
}
}
]
)
Wynik:
{ "_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 }
Widzimy, że tylko jedno pole miało wartość null i dlatego jako jedyne zwróciło "Value not provided"
.
Niezdefiniowane i brakujące pola
Jak wspomniano, niezdefiniowane wartości i brakujące pola są traktowane jako wartości puste.
Załóżmy, że do naszej kolekcji dodamy następujące dokumenty:
{ "_id" : 9, "data" : undefined } { "_id" : 10, "name" : "Homer" }
W tym przypadku dokument 9 ma undefined
w polu danych, ale dokument 10 nie zawiera nawet data
pole.
Oto, co się dzieje, gdy zastosujemy $ifNull
do tych dokumentów:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 9, 10 ] } } },
{
$project:
{
result: { $ifNull: [ "$data", "Value not provided" ] }
}
}
]
)
Wynik:
{ "_id" : 9, "result" : "Value not provided" } { "_id" : 10, "result" : "Value not provided" }