В MongoDB можете да използвате $exists
оператор на заявка за елемент, за да съвпадне документи, които съдържат конкретно поле.
Можете също да го използвате, за да съпоставите документи, които не съдържат конкретно поле.
Можете също да го използвате във връзка с други оператори като $nin
за да съответства на документи, където съществува дадено поле, но то не съдържа конкретна стойност.
Пример
Да предположим, че имаме колекция, наречена cats
който съдържа следните документи:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 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") }
Тези документи са леко непоследователни по отношение на полетата, които имат. Някои имат weight
поле, други имат height
поле, някои имат born
поле и др.
Можем да използваме $exists
оператор, за да върне документи от тази колекция, които имат конкретно поле.
Пример:
db.cats.find( { weight: { $exists: true } } )
Резултат:
{ "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Можем да видим, че само тези документи, които съдържат weight
поле се връщат.
Полета, които съдържат null
$exists
операторът включва полета, които съдържат null
. Той не прави разлика между null
и не-null
стойности.
Пример:
db.cats.find( { name: { $exists: true } } )
Резултат:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 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 }
Можем да видим, че документ 5 е върнат, въпреки че е name
полето е null
.
Съществува без конкретна стойност
Можете да комбинирате $exists
с други оператори, за да върне документи, които съдържат полето, но това поле не съдържа конкретна стойност.
Пример:
db.cats.find( { weight: { $exists: true, $nin: [20,30] } } )
Резултат:
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
Това е различен резултат от този, който щяхме да видим, ако просто използвахме $nin
без $exists
оператор.
Ето как би изглеждало това:
db.cats.find( { weight: { $nin: [20,30] } } )
Резултат:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 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") }
Документи, които не съдържат конкретно поле
Можете да използвате $exists: false
за връщане на документи, които не съдържат посоченото поле.
Пример:
db.cats.find( { name: { $exists: false } } )
Резултат:
{ "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
В този случай един документ в колекцията не съдържа name
поле.
Проверка за множество полета
Можете да проверите за съществуването на множество полета, като ги разделите със запетая.
Пример:
db.cats.find( {
name: { $exists: true },
height: { $exists: true }
} )
Резултат:
{ "_id" : 3, "name" : "Fluffy", "height" : 15 }
Този пример връща всички документи, които съдържат и двете name
поле и height
поле.