I MongoDB kan du använda $exists
elementfrågeoperator för att matcha dokument som innehåller ett specifikt fält.
Du kan också använda den för att matcha dokument som inte innehåller ett specifikt fält.
Du kan också använda den tillsammans med andra operatorer som $nin
för att matcha dokument där ett givet fält finns, men det inte innehåller ett specifikt värde.
Exempel
Anta att vi har en samling som heter cats
som innehåller följande dokument:
{ "_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") }
Dessa dokument är något inkonsekventa med avseende på de fält som de har. Vissa har en weight
fält, andra har en height
fält, vissa har en born
fält, etc
Vi kan använda $exists
operatör för att returnera dokument från den samlingen som har ett specifikt fält.
Exempel:
db.cats.find( { weight: { $exists: true } } )
Resultat:
{ "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Vi kan se att endast de dokument som innehåller en weight
fältet returneras.
Fält som innehåller null
$exists
operatorn inkluderar fält som innehåller null
. Den skiljer inte mellan null
och icke-null
värden.
Exempel:
db.cats.find( { name: { $exists: true } } )
Resultat:
{ "_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 }
Vi kan se att dokument 5 returnerades, även om dess name
fältet är null
.
Finns utan ett specifikt värde
Du kan kombinera $exists
med andra operatörer för att returnera dokument som innehåller fältet, men det fältet innehåller inte ett specifikt värde.
Exempel:
db.cats.find( { weight: { $exists: true, $nin: [20,30] } } )
Resultat:
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
Detta är ett annat resultat än det vi skulle ha sett om vi helt enkelt hade använt $nin
utan $exists
operatör.
Så här skulle det ha sett ut:
db.cats.find( { weight: { $nin: [20,30] } } )
Resultat:
{ "_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") }
Dokument som inte innehåller ett specifikt fält
Du kan använda $exists: false
för att returnera dokument som inte gör det innehålla det angivna fältet.
Exempel:
db.cats.find( { name: { $exists: false } } )
Resultat:
{ "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
I det här fallet innehåller ett dokument i samlingen inte name
fältet.
Se efter flera fält
Du kan kontrollera att det finns flera fält genom att separera dem med ett kommatecken.
Exempel:
db.cats.find( {
name: { $exists: true },
height: { $exists: true }
} )
Resultat:
{ "_id" : 3, "name" : "Fluffy", "height" : 15 }
Detta exempel returnerar alla dokument som innehåller både ett name
fält och en height
fältet.