In MongoDB, you can use the $exists element query operator to match documents that contain a specific field.
You can also use it to match documents that don’t contain a specific field.
You can also use it in conjunction with other operators such $nin to match documents where a given field exists, but it doesn’t contain a specific value.
Example
Suppose we have a collection called cats that contains the following documents:
{ "_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") }
These documents are slightly inconsistent with regards to the fields that they have. Some have a weight field, others have a height field, some have a born field, etc
We can use the $exists operator to return documents from that collection that have a specific field.
Example:
db.cats.find( { weight: { $exists: true } } )
Result:
{ "_id" : 2, "name" : "Meow", "weight" : 30 }
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
{ "_id" : 5, "name" : null, "weight" : 20 }
We can see that only those documents that contain a weight field are returned.
Fields that Contain null
The $exists operator includes fields that contain null. It doesn’t discriminate between null and non-null values.
Example:
db.cats.find( { name: { $exists: true } } )
Result:
{ "_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 }
We can see that document 5 was returned, even though its name field is null.
Exists Without a Specific Value
You can combine $exists with other operators to return documents that contain the field, but that field doesn’t contain a specific value.
Example:
db.cats.find( { weight: { $exists: true, $nin: [20,30] } } )
Result:
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
This is a different result to the one we would have seen if we’d simply used $nin without the $exists operator.
Here’s what that would have looked like:
db.cats.find( { weight: { $nin: [20,30] } } )
Result:
{ "_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") }
Documents that Don’t Contain a Specific Field
You can use $exists: false to return documents that don’t contain the specified field.
Example:
db.cats.find( { name: { $exists: false } } )
Result:
{ "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
In this case, one document in the collection doesn’t contain the name field.
Check for Multiple Fields
You can check for the existence of multiple fields by separating them with a comma.
Example:
db.cats.find( {
name: { $exists: true },
height: { $exists: true }
} )
Result:
{ "_id" : 3, "name" : "Fluffy", "height" : 15 }
This example returns all documents that contain both a name field and a height field.