Definición
$type$typeselecciona documentos donde el valor defieldes una instancia del especificado Tipo(s) deBSON. Consultar por tipo de dato es útil cuando se trabaja con datos muy desestructurados, donde los tipos de datos no son predecibles.
Compatibilidad
Puedes usar $type para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
Una expresión$type para un único tipo BSON tiene la siguiente sintaxis:
{ field: { $type: <BSON type> } }
Puedes especificar el número o alias para el tipo BSON.
La expresión $type también puede aceptar un arreglo de tipos BSON y tiene la siguiente sintaxis:
{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }
El query anterior coincide con documentos donde el valor field es cualquiera de los tipos indicados. Los tipos especificados en el arreglo pueden ser alias numéricos o de string.
Ve Consulta por múltiples tipos de datos para obtener un ejemplo.
Tipos Disponibles describe los BSON types y sus correspondientes alias numéricos y de string.
Tip
$isNumber- comprueba si el argumento es un número.$type (Aggregation)- devuelve el tipo BSON del argumento.
Comportamiento
$type devuelve documentos donde el tipo BSON del field coincide con el tipo BSON pasado a $type.
Arreglos
Para documentos donde field es un arreglo, $type devuelve documentos en los que al menos un elemento del arreglo coincide con un tipo pasado a $type.
Los queries para $type: "array" devuelven documentos donde el campo en sí es un arreglo.
Tipos disponibles
El $type Operador acepta alias de string para los BSON types además de los números correspondientes a los BSON types. [1]
Tipo | Número | Alias | notas |
|---|---|---|---|
Double | 1 | "double" | |
String | 2 | "string" | |
Objeto | 3 | "objeto" | |
Arreglo | 4 | "arreglo" | |
Datos binarios | 5 | "binData" | |
Indefinido | 6 | "indefinido" | Obsoleto. |
ObjectId | 7 | "objectId" | |
Booleano | 8 | "bool" | |
fecha | 9 | "date" | |
Nulo | 10 | "null" | |
Expresión regular | 11 | "regex" | |
DBPointer | 12 | "dbPointer" | Obsoleto. |
JavaScript | 13 | "javascript" | |
Símbolo | 14 | "symbol" | Obsoleto. |
JavaScript con ámbito | 15 | "javascriptConÁmbito" | Obsoleto. |
entero de 32 bits | 16 | "int" | |
Marca de tiempo | 17 | "marca de tiempo" | |
entero de 64 bits | 18 | "long" | |
Decimal128 | 19 | "Decimal" | |
Min key | -1 | "minKey" | |
Clave máxima | 127 | "maxKey" |
$type proporciona soporte al alias number, que coincide con los siguientes tipos BSON:
Para ejemplos, consulte Ejemplos.
| [1] | Los usuarios ya no pueden utilizar el filtro de query $type: 0 como sinónimo de $exists:false. Para realizar las query en campos nulos o faltantes, consulta Query de campos nulos o faltantes. |
Tip
MinKey y MaxKey
MinKey y MaxKey se utilizan en operaciones de comparación y existen principalmente para uso interno. Para todos los valores posibles de elementos BSON, MinKey siempre es el valor más pequeño, mientras que MaxKey siempre es el valor más alto.
La consulta de minKey o maxKey con $type solo devuelve los campos que coinciden con los valores especiales MinKey o MaxKey.
Supón que la colección data tiene dos documentos con MinKey y MaxKey:
db.data.insertMany( [ { _id : 1, x : { "$minKey" : 1 } }, { _id : 2, y : { "$maxKey" : 1 } } ] )
El siguiente query devuelve el documento con _id: 1:
db.data.find( { x: { $type: "minKey" } } )
El siguiente query devuelve el documento con _id: 2:
db.data.find( { y: { $type: "maxKey" } } )
Ejemplos
Consulta por tipo de dato
El addressBook contiene direcciones y códigos postales, donde zipCode tiene valores de string, int, double y long:
db.addressBook.insertMany( [ { _id : 1, address : "2030 Martian Way", zipCode : "90698345" }, { _id : 2, address : "156 Lunar Place", zipCode : 43339374 }, { _id : 3, address : "2324 Pluto Place", zipCode : Long(3921412) }, { _id : 4, address : "55 Saturn Ring" , zipCode : Int32(88602117) }, { _id : 5, address : "104 Venus Drive", zipCode : ["834847278", "1893289032"] } ] )
Los siguientes queries devuelven todos los documentos donde zipCode es del tipo BSON string o es un arreglo que contiene un elemento del tipo especificado:
db.addressBook.find( { zipCode : { $type : 2 } } ); db.addressBook.find( { zipCode : { $type : "string" } } );
Estos queries devuelven:
{ _id : 1, address : "2030 Martian Way", zipCode : "90698345" } { _id : 5, address : "104 Venus Drive", zipCode : [ "834847278", "1893289032" ] }
Los siguientes queries devuelven todos los documentos donde zipCode es del tipo BSON double o es un arreglo que contiene un elemento del tipo especificado:
db.addressBook.find( { zipCode : { $type : 1 } } ); db.addressBook.find( { zipCode : { $type : "double" } } );
Estos queries devuelven:
{ _id : 2, address : "156 Lunar Place", zipCode : 43339374 }
El siguiente query utiliza el alias number para devolver documentos donde zipCode es del tipo BSON double, int, o long o es un arreglo que contiene un elemento de los tipos especificados:
db.addressBook.find( { zipCode : { $type : "number" } } )
Estos queries devuelven:
{ _id : 2, address : "156 Lunar Place", zipCode : 43339374 } { _id : 3, address : "2324 Pluto Place", zipCode : Long(3921412) } { _id : 4, address : "55 Saturn Ring", zipCode : 88602117 }
Consultas por múltiples tipos de datos
La colección grades contiene nombres y promedios, donde classAverage tiene valores string, int y double:
db.grades.insertMany( [ { _id : 1, name : "Alice King" , classAverage : 87.333333333333333 }, { _id : 2, name : "Bob Jenkins", classAverage : "83.52" }, { _id : 3, name : "Cathy Hart", classAverage: "94.06" }, { _id : 4, name : "Drew Williams" , classAverage : Int32("93") } ] )
Los siguientes queries devuelven todos los documentos donde classAverage es del tipo BSON string o double o es un arreglo que contiene un elemento de los tipos especificados. El primer query usa alias numéricos, mientras que el segundo query usa alias de strings.
db.grades.find( { classAverage : { $type : [ 2 , 1 ] } } ); db.grades.find( { classAverage : { $type : [ "string" , "double" ] } } );
Estos queries devuelven los siguientes documentos:
{ _id : 1, name : "Alice King", classAverage : 87.33333333333333 } { _id : 2, name : "Bob Jenkins", classAverage : "83.52" } { _id : 3, name : "Cathy Hart", classAverage : "94.06" }
Consulta mediante MinKey y MaxKey
La colección restaurants utiliza minKey para cualquier calificación fallida:
db.restaurants.insertOne( [ { _id: 1, address: { building: "230", coord: [ -73.996089, 40.675018 ], street: "Huntington St", zipcode: "11231" }, borough: "Brooklyn", cuisine: "Bakery", grades: [ { date : new Date(1393804800000), grade : "C", score : 15 }, { date : new Date(1378857600000), grade : "C", score : 16 }, { date : new Date(1358985600000), grade : MinKey(), score : 30 }, { date : new Date(1322006400000), grade : "C", score : 15 } ], name : "Dirty Dan's Donuts", restaurant_id : "30075445" } ] )
Y maxKey para cualquier calificación que sea la nota máxima de aprobación:
db.restaurants.insertOne( [ { _id : 2, address : { building : "1166", coord : [ -73.955184, 40.738589 ], street : "Manhattan Ave", zipcode : "11222" }, borough: "Brooklyn", cuisine: "Bakery", grades: [ { date : new Date(1393804800000), grade : MaxKey(), score : 2 }, { date : new Date(1378857600000), grade : "B", score : 6 }, { date : new Date(1358985600000), grade : MaxKey(), score : 3 }, { date : new Date(1322006400000), grade : "B", score : 5 } ], name : "Dainty Daisey's Donuts", restaurant_id : "30075449" } ] )
El siguiente query devuelve cualquier restaurante cuyo campo grades.grade contiene minKey o es un arreglo que contiene un elemento del tipo especificado:
db.restaurants.find( { "grades.grade" : { $type : "minKey" } } )
Esto devuelve los siguientes resultados:
{ _id : 1, address : { building : "230", coord : [ -73.996089, 40.675018 ], street : "Huntington St", zipcode : "11231" }, borough : "Brooklyn", cuisine : "Bakery", grades : [ { date : ISODate("2014-03-03T00:00:00Z"), grade : "C", score : 15 }, { date : ISODate("2013-09-11T00:00:00Z"), grade : "C", score : 16 }, { date : ISODate("2013-01-24T00:00:00Z"), grade : { "$minKey" : 1 }, score : 30 }, { date : ISODate("2011-11-23T00:00:00Z"), grade : "C", score : 15 } ], name : "Dirty Dan's Donuts", restaurant_id : "30075445" }
El siguiente query devuelve cualquier restaurante cuyo campo grades.grade contiene maxKey o es un arreglo que contiene un elemento del tipo especificado:
db.restaurants.find( { "grades.grade" : { $type : "maxKey" } } )
Esto devuelve los siguientes resultados:
{ _id : 2, address : { building : "1166", coord : [ -73.955184, 40.738589 ], street : "Manhattan Ave", zipcode : "11222" }, borough : "Brooklyn", cuisine : "Bakery", grades : [ { date : ISODate("2014-03-03T00:00:00Z"), grade : { "$maxKey" : 1 }, score : 2 }, { date : ISODate("2013-09-11T00:00:00Z"), grade : "B", score : 6 }, { date : ISODate("2013-01-24T00:00:00Z"), grade : { "$maxKey" : 1 }, score : 3 }, { date : ISODate("2011-11-23T00:00:00Z"), grade : "B", score : 5 } ], name : "Dainty Daisey's Donuts", restaurant_id : "30075449" }
Consulta por tipo de arreglo
Una colección llamada sensorReading contiene los siguientes documentos:
db.sensorReading.insertMany( [ { _id : 1, readings : [ 25, 23, [ "Warn: High Temp!", 55 ], [ "ERROR: SYSTEM SHUTDOWN!", 66 ] ] }, { _id : 2, readings : [ 25, 25, 24, 23 ] }, { _id : 3, readings : [ 22, 24, [] ] }, { _id : 4, readings : [] }, { _id : 5, readings : 24 } ] )
El siguiente query devuelve cualquier documento en el que el campo readings sea un arreglo, ya sea vacío o no.
db.SensorReading.find( { readings : { $type: "array" } } )
El query anterior devuelve los siguientes documentos:
{ _id : 1, readings : [ 25, 23, [ "Warn: High Temp!", 55 ], [ "ERROR: SYSTEM SHUTDOWN!", 66 ] ] }, { _id : 2, readings : [ 25, 25, 24, 23 ] }, { _id : 3, readings : [ 22, 24, [] ] }, { _id : 4, readings : [] }
En los documentos con _id : 1, _id : 2, _id : 3, y _id : 4, el campo readings es un arreglo.