Element query operators
Element query operators return data based on the existence of a specified field or the data type of a particular value.
Operator | Description |
---|---|
$exists | returns documents where a field exists or does not exist |
$type | matches document containing elements with the specified type |
For the examples in this section, insert the following documents into the electronics
collection:
db.electronics.insertMany([
{
product: 'laptop',
price: 1500,
stock: 5,
discount: true,
specifications: [
{
processor: 'Intel Core i7'
},
{
memory: 16
}
]
},
{
product: 'phone',
price: 800,
stock: 10,
discount: true,
specifications: [
{
brand: 'Apple'
},
{
model: 'iPhone 12'
}
]
},
{
product: 'tablet',
price: 500,
stock: 15,
discount: true,
specifications: [
{
brand: 'Samsung'
},
{
model: 'Galaxy Tab S7'
}
]
},
{
product: 'keyboard',
price: 100,
stock: 20
},
{
product: 'mouse',
price: 50,
stock: 25,
discount: null,
specifications: []
},
{
product: 'monitor',
price: 250,
stock: 30,
discount: true,
specifications: [
{
size: 27
},
{
resolution: '4K'
}
]
},
{
product: 'printer',
price: 150,
stock: 35,
discount: false
},
{
product: 'scanner',
price: 100,
stock: 40,
discount: true,
specifications: [
{
type: 'flatbed'
}
]
}
])
$exists
Syntax: { <field>: { $exists: <boolean> } }
To find out if a particular field exists in a document, use the $exists
operator.
If the <boolean>
value is true
, the query returns documents where the specified field exists, even if the value is null
or an empty array.
If the <boolean>
value is false
, the query returns documents where the specified field does not exist.
Example: Find documents in the electronics
collection where the specifications
field exists using the $exists
operator:
db.electronics.find({
specifications: {
$exists: true
}
})
The output:
[
{
_id: ObjectId("63a32fc7cf72d6203bb45b8e"),
product: 'laptop',
price: 1500,
stock: 5,
discount: true,
specifications: [{ processor: 'Intel Core i7' }, { memory: 16 }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b8f"),
product: 'phone',
price: 800,
stock: 10,
discount: true,
specifications: [{ brand: 'Apple' }, { model: 'iPhone 12' }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b90"),
product: 'tablet',
price: 500,
stock: 15,
discount: true,
specifications: [{ brand: 'Samsung' }, { model: 'Galaxy Tab S7' }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b92"),
product: 'mouse',
price: 50,
stock: 25,
discount: null,
specifications: []
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b93"),
product: 'monitor',
price: 250,
stock: 30,
discount: true,
specifications: [{ size: 27 }, { resolution: '4K' }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b95"),
product: 'scanner',
price: 100,
stock: 40,
discount: true,
specifications: [{ type: 'flatbed' }]
}
]
In the above output, the query returns all documents where the specifications
field exists, even when the field
has an empty value.
If you want to find documents where the specifications
field exists and has a specific value, use the $exists
operator in conjunction with other operators.
Example: The following query returns all documents where the specifications
field exists and its value is an array:
db.electronics.find({
specifications: {
$exists: true,
$type: 'array'
}
})
The output:
[
{
_id: ObjectId("63a32fc7cf72d6203bb45b8e"),
product: 'laptop',
price: 1500,
stock: 5,
discount: true,
specifications: [{ processor: 'Intel Core i7' }, { memory: 16 }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b8f"),
product: 'phone',
price: 800,
stock: 10,
discount: true,
specifications: [{ brand: 'Apple' }, { model: 'iPhone 12' }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b90"),
product: 'tablet',
price: 500,
stock: 15,
discount: true,
specifications: [{ brand: 'Samsung' }, { model: 'Galaxy Tab S7' }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b92"),
product: 'mouse',
price: 50,
stock: 25,
discount: null,
specifications: []
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b93"),
product: 'monitor',
price: 250,
stock: 30,
discount: true,
specifications: [{ size: 27 }, { resolution: '4K' }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b95"),
product: 'scanner',
price: 100,
stock: 40,
discount: true,
specifications: [{ type: 'flatbed' }]
}
]
$type
Syntax: { <field>: { $type: <datatype> } }
Use the $type
operator to select documents where the data type of a field matches the specified BSON type
The <datatype>
parameter can be the type code or alias of the particular data type.
The following table lists the available BSON type codes and their corresponding aliases:
Type code | Type | Alias |
---|---|---|
1 | Double | double |
2 | String | string |
3 | Object | object |
4 | Array | array |
5 | Binary data | binData |
7 | ObjectId | objectId |
8 | Boolean | bool |
9 | Date | date |
10 | Null | null |
11 | Regular expression | regex |
16 | 32-bit integer | int |
17 | Timestamp | timestamp |
18 | 64-bit integer | long |
19 | Decimal128 | decimal |
-1 | Min key | minKey |
127 | Max key | maxKey |
-128 | Number | number |
Decimal128
, Min Key
, and Max Key
are not currently implemented.
FerretDB supports the alias number
which matches the following BSON types: Double
, 32-bit integer
, and 64-bit integer
type values.
FerretDB supports the alias number
which matches the following BSON types: Double
, 32-bit integer
, and 64-bit integer
type values.
Example: The following operation query returns all documents in the electronics
collection where the discount
field has a boolean data type, which can be represented with the data code 8
:
db.electronics.find({
discount: {
$type: 8
}
})
This query can also be written using the alias of the specified data type.
db.electronics.find({
discount: {
$type: 'bool'
}
})
The output:
[
{
_id: ObjectId("63a32fc7cf72d6203bb45b8e"),
product: 'laptop',
price: 1500,
stock: 5,
discount: true,
specifications: [{ processor: 'Intel Core i7' }, { memory: 16 }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b8f"),
product: 'phone',
price: 800,
stock: 10,
discount: true,
specifications: [{ brand: 'Apple' }, { model: 'iPhone 12' }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b90"),
product: 'tablet',
price: 500,
stock: 15,
discount: true,
specifications: [{ brand: 'Samsung' }, { model: 'Galaxy Tab S7' }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b93"),
product: 'monitor',
price: 250,
stock: 30,
discount: true,
specifications: [{ size: 27 }, { resolution: '4K' }]
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b94"),
product: 'printer',
price: 150,
stock: 35,
discount: false
},
{
_id: ObjectId("63a32fc7cf72d6203bb45b95"),
product: 'scanner',
price: 100,
stock: 40,
discount: true,
specifications: [{ type: 'flatbed' }]
}
]