В MongoDB, $ifNull е оператор на конвейер за агрегиране, който ви позволява да зададете стойност, която да използвате вместо null .
Начинът, по който работи, е, че предоставяте израз и заместващ израз. Ако изразът се оценява на стойност, различна от нула, този израз се връща. Но ако изразът се оценява на нулева стойност, $ifNull връща стойността на заместващия израз.
Нулевата стойност включва екземпляри на недефинирани стойности или липсващи полета.
Пример
Да предположим, че имаме колекция, наречена test със следните документи:
{ "_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 }
Ето какво се случва, ако използваме $ifNull оператор на data поле:
db.test.aggregate(
[
{
$project:
{
result: { $ifNull: [ "$data", "Value not provided" ] }
}
}
]
) Резултат:
{ "_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 }
Можем да видим, че само едно поле имаше нулева стойност и следователно то беше единственото, което върна "Value not provided" .
Недефинирани и липсващи полета
Както споменахме, недефинираните стойности и липсващите полета се третират като нулеви стойности.
Да предположим, че добавяме следните документи към нашата колекция:
{ "_id" : 9, "data" : undefined }
{ "_id" : 10, "name" : "Homer" }
В този случай документ 9 има undefined в полето за данни, но документ 10 дори няма data поле.
Ето какво се случва, когато приложим $ifNull към тези документи:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 9, 10 ] } } },
{
$project:
{
result: { $ifNull: [ "$data", "Value not provided" ] }
}
}
]
) Резултат:
{ "_id" : 9, "result" : "Value not provided" }
{ "_id" : 10, "result" : "Value not provided" }