W MongoDB możesz użyć $exists
elementowy operator zapytania w celu dopasowania dokumentów zawierających określone pole.
Możesz go również użyć do dopasowania dokumentów, które nie zawierają określonego pola.
Możesz go również używać w połączeniu z innymi operatorami, takimi jak $nin
aby dopasować dokumenty, w których dane pole istnieje, ale nie zawiera określonej wartości.
Przykład
Załóżmy, że mamy kolekcję o nazwie cats
który zawiera następujące dokumenty:
{ "_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") }
Dokumenty te są nieco niespójne w odniesieniu do pól, które mają. Niektóre mają weight
pole, inne mają height
pole, niektóre mają born
pole itp
Możemy użyć $exists
operatora, aby zwrócić dokumenty z tej kolekcji, które mają określone pole.
Przykład:
db.cats.find( { weight: { $exists: true } } )
Wynik:
{ "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Widzimy, że tylko te dokumenty, które zawierają weight
pola są zwracane.
Pola zawierające null
$exists
operator zawiera pola zawierające null
. Nie rozróżnia null
i inne niż null
wartości.
Przykład:
db.cats.find( { name: { $exists: true } } )
Wynik:
{ "_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 }
Widzimy, że dokument 5 został zwrócony, mimo że jego name
pole jest null
.
Istnieje bez określonej wartości
Możesz połączyć $exists
z innymi operatorami, aby zwrócić dokumenty zawierające to pole, ale to pole nie zawiera określonej wartości.
Przykład:
db.cats.find( { weight: { $exists: true, $nin: [20,30] } } )
Wynik:
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
To inny wynik niż ten, który zobaczylibyśmy, gdybyśmy po prostu użyli $nin
bez $exists
operatora.
Oto, jak by to wyglądało:
db.cats.find( { weight: { $nin: [20,30] } } )
Wynik:
{ "_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") }
Dokumenty, które nie zawierają określonego pola
Możesz użyć $exists: false
zwracać dokumenty, których nie zawierać określone pole.
Przykład:
db.cats.find( { name: { $exists: false } } )
Wynik:
{ "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
W takim przypadku jeden dokument w kolekcji nie zawiera name
pole.
Sprawdź wiele pól
Możesz sprawdzić, czy istnieje wiele pól, oddzielając je przecinkami.
Przykład:
db.cats.find( {
name: { $exists: true },
height: { $exists: true }
} )
Wynik:
{ "_id" : 3, "name" : "Fluffy", "height" : 15 }
Ten przykład zwraca wszystkie dokumenty, które zawierają zarówno name
pole i height
pole.