Docs Menu
Docs Home
/ /

Tipos de datos

MongoDB almacena datos utilizando BSON, que admite tipos de datos adicionales que no están disponibles en JSON. El mongosh shell tiene un mejor soporte de tipos de datos para los controladores que el mongo shell heredado.

Este documento resalta los cambios en el uso de tipos entre mongosh y el shell mongo heredado. Consultar la referencia de JSON extendido para obtener información adicional sobre los tipos compatibles.

mongosh proporciona varios métodos para devolver la fecha, ya sea como una string o como un objeto Date:

  • Date() método que devuelve la fecha actual como un string.

  • new Date() constructor que devuelve un objeto Date usando el contenedor ISODate().

  • ISODate() constructor que devuelve un objeto Date usando el contenedor ISODate().

mongosh proporciona la clase de contenedor ObjectId() alrededor del tipo de dato ObjectId. Para generar un nuevo ObjectId, se debe usar la siguiente operación en mongosh:

new ObjectId

A partir de la versión 1.8.0, el contenedor ObjectId ya no acepta:

  • ObjectId.prototype.generate

  • ObjectId.prototype.getInc

  • ObjectId.prototype.get_inc

  • ObjectId.getInc

Tip

El doble() El constructor se puede utilizar para especificar explícitamente un doble:

db.types.insertOne(
{
"_id": 2,
"value": Double(1),
"expectedType": "Double"
}
)

Nota

Si el valor de un campo es un número que puede convertirse en un entero de 32 bits, mongosh lo almacenará como Int32. De lo contrario, mongosh almacena por defecto el número como Double. Para especificar el tipo de valor, se deben usar los constructores Double() o Int32().

El constructor Int32() se puede utilizar para especificar explícitamente enteros de 32bits.

db.types.insertOne(
{
"_id": 1,
"value": Int32(1),
"expectedType": "Int32"
}
)

Advertencia

Los tipos Int32 y Double por defecto pueden almacenarse de forma inconsistente si se conecta a la misma colección usando tanto mongosh como el shell mongo heredado.

El constructor Long() se puede utilizar para especificar explícitamente un entero de 64 bits.

db.types.insertOne(
{
"_id": 3,
"value": Long(1),
"expectedType": "Long"
}
)

Nota

En el shell mongo heredado, NumberLong() se aceptaba un valor de string o entero. En mongosh, NumberLong() solo acepta valores de string. Long() proporciona métodos para gestionar las conversiones hacia y desde valores de 64 bits.

Decimal128() son valores de números de punto flotante basados en decimales de 128 bits que emulan el redondeo decimal con precisión exacta.

Esta funcionalidad está destinada a las aplicaciones que gestionan datos monetarios, como cálculos financieros, fiscales y científicos.

El Decimal128 tipo BSON utiliza el formato de numeración de punto flotante decimal IEEE 754 128 que admite 34 dígitos decimales (es decir, dígitos significativos) y un rango de exponentes de −6143 a +6144.

db.types.insertOne(
{
"_id": 5,
"value": Decimal128("1"),
"expectedType": "Decimal128"
}
)

Nota

Para usar el tipo de dato Decimal128 con un driver de MongoDB, se debe garantizar el uso de una versión del driver que lo soporte.

Los valores del tipo Decimal128 se comparan y ordenan con otros tipos numéricos según su valor numérico real. Los valores numéricos del tipo Double basado en binario generalmente tienen representaciones aproximadas de valores basados en decimales y pueden no ser exactamente iguales a sus representaciones decimales.

MongoDB usa un Timestamp BSON internamente en el oplog. El tipo Timestamp funciona de manera similar al tipo Timestamp de Java. Usa el tipo Date para las operaciones que impliquen fechas.

Una firma Timestamp tiene dos parámetros opcionales.

Timestamp( { "t": <integer>, "i": <integer> } )
Parameter
Tipo
predeterminado
Definición

t

entero

Tiempo actual desde UNIX epoch.

Opcional. Un tiempo en segundos.

i

entero

1

Opcional. Se utiliza para ordenar cuando hay múltiples operaciones dentro de un segundo dado. i no tiene efecto si se usa sin t.

Para ejemplos de uso, vea Establecer una marca de tiempo en un documento nuevo, Crear una marca de tiempo personalizada.

Utilice el operador del query$type o examine el constructor de objeto para determinar tipos.

El operador typeof de Javascript devuelve valores genéricos como number o object en lugar de los más específicos Int32 o ObjectId.

El operador instanceof de JavaScript no es confiable. Por ejemplo, instanceof asigna valores BSON en una respuesta del servidor a una clase base diferente a los valores proporcionados por el usuario.

Para ejemplos de uso, consulta Comprobación de tipos con $type() y Comprobación de tipos con un constructor.

Para devolver la fecha como un string, utilice el método Date(), como en el siguiente ejemplo:

var myDateString = Date();

Para imprimir el valor de la variable, escriba el nombre de la variable en el Shell, como en el siguiente ejemplo:

myDateString

El resultado es el valor de myDateString:

Wed Dec 19 2012 01:03:25 GMT-0500 (EST)

Para verificar el tipo, utilice el operador typeof, como en el siguiente ejemplo:

typeof myDateString

La operación devuelve string.

mongosh envuelve objetos de tipo Date con el asistente ISODate; sin embargo, los objetos siguen siendo del tipo Date.

El siguiente ejemplo utiliza tanto el constructor new Date() como el constructor ISODate() para devolver objetos Date.

var myDate = new Date();
var myDateInitUsingISODateWrapper = ISODate();

También puede usar el operador new con el constructor ISODate().

Para imprimir el valor de la variable, escriba el nombre de la variable en el Shell, como en el siguiente ejemplo:

myDate

El resultado es el valor Date de myDate envuelto en el asistente ISODate():

ISODate("2012-12-19T06:01:17.171Z")

Para verificar el tipo:

var myDate = ISODate("2021-03-21T06:00:00.171Z")
Object.prototype.toString.call(myDate) === "[object Date]"

La operación devuelve true.

Considere la colección types:

{ _id: 1, value: 1, expectedType: 'Int32' },
{ _id: 2, value: Long("1"), expectedType: 'Long' },
{ _id: 3, value: 1.01, expectedType: 'Double' },
{ _id: 4, value: Decimal128("1.01"), expectedType: 'Decimal128' },
{ _id: 5, value: 3200000001, expectedType: 'Double' }

Esta tabla muestra los resultados del comando db.types.find( <QUERY> ) para el <QUERY> correspondiente. Los nombres de tipo y alias se proporcionan en la página de BSON types.

Query
Resultados
{
"value":
{
$type: "int"
}
}
{
_id: 1,
value: 1,
expectedType: 'Int32'
}
{
"value":
{
$type: "long"
}
}
{
_id: 2,
value: Long("1"),
expectedType: 'Long'
}
{
"value":
{
$type: "decimal"
}
}
{
_id: 4,
value: Decimal128("1"),
expectedType: 'Decimal128'
}
{
"value":
{
$type: "double"
}
}
{
_id: 3,
value: 1.01,
expectedType: 'Double'
}
{
_id: 5,
value: 3200000001,
expectedType: 'Double'
}
{
"value":
{
$type: "number"
}
}
{
_id: 1,
value: 1,
expectedType: 'Int32'
}
{
_id: 2,
value: Long("1"),
expectedType: 'Long'
}
{
_id: 3,
value: 1.01,
expectedType: 'Double'
}
{
_id: 4,
value: Decimal128("1.01"),
expectedType: 'Decimal128'
}
{
_id: 5,
value: 3200000001,
expectedType: 'Double'
}
{
"value": 1.01
}
{
_id: 3,
value: 1.01,
expectedType: 'Double'
}
{
"value": 1
}
{
_id: 1,
value: 1,
expectedType: 'Int32'
}
{
_id: 2,
value: Long("1"),
expectedType: 'Long'
}

La query { "value": 1.01 } busca implícitamente la representación Double de 1.01. El documento _id: 4 es un Decimal128, por lo tanto, no se selecciona.

Sin embargo, tenga en cuenta que { "value": 1 } devuelve tanto tipos Int32 como Long.

Considere la colección typeExample. Esta colección consta de dos documentos idénticos, { "a": 1 }. El primer documento fue creado en el shell mongo heredado, y el segundo documento fue creado en mongosh.

Podemos utilizar el operador $type en un pipeline de agregación para ver el tipo que se asignó en cada shell.

db.typeExample.aggregate(
[
{
$project:
{
"valueType":
{
"$type": "$a"
},
"_id": 0
}
}
]
)

En el primer documento, creado en el shell mongo heredado, el valor se almacenó como double. En el documento mongosh, el valor se almacenó como tipo int.

[
{
valueType: 'double' // inserted in legacy mongo shell
},
{
valueType: 'int' // inserted in mongosh
}
]

Utiliza Timestamp() sin parámetros para insertar varios documentos usando la configuración por defecto:

db.flights.insertMany(
[
{ arrival: "true", ts: Timestamp() },
{ arrival: "true", ts: Timestamp() },
{ arrival: "true", ts: Timestamp() }
]
)

Ejecuta db.flights.find({}) para ver las marcas de tiempo. Observa que, aunque las tres entradas fueron selladas en el mismo segundo, el intervalo se incrementó en cada una.

[
{
_id: ObjectId("6114216907d84f5370391919"),
arrival: 'true',
ts: Timestamp({ t: 1628709225, i: 1 })
},
{
_id: ObjectId("6114216907d84f537039191a"),
arrival: 'true',
ts: Timestamp({ t: 1628709225, i: 2 })
},
{
_id: ObjectId("6114216907d84f537039191b"),
arrival: 'true',
ts: Timestamp({ t: 1628709225, i: 3 })
}
]

Utiliza parámetros personalizados para insertar múltiples documentos con un Timestamp específico.

Esta operación inserta tres documentos en la colección flights y utiliza el valor de UNIX epoch 1627811580 para establecer los tiempos ts a las 9:53 GMT el 1 de agosto de 2021.

db.flights.insertMany(
[
{ arrival: "true", ts: Timestamp(1627811580, 10) },
{ arrival: "true", ts: Timestamp(1627811580, 20) },
{ arrival: "true", ts: Timestamp(1627811580, 30) }
]
)

Los documentos resultantes se ven así:

[
{
_id: ObjectId("6123d8315e6bba6f61a1031c"),
arrival: 'true',
ts: Timestamp({ t: 1627811580, i: 10 })
},
{
_id: ObjectId("6123d8315e6bba6f61a1031d"),
arrival: 'true',
ts: Timestamp({ t: 1627811580, i: 20 })
},
{
_id: ObjectId("6123d8315e6bba6f61a1031e"),
arrival: 'true',
ts: Timestamp({ t: 1627811580, i: 30 })
}
]

El operador del query $type acepta un alias de string o un código numérico correspondiente al tipo de dato. Consulte BSON Types para obtener una lista de tipos de datos BSON y sus códigos numéricos correspondientes.

Por ejemplo, estas verificaciones para el tipo Decimal128 son equivalentes:

db.types.find( { "value": { $type: "decimal" } } )
db.types.find( { "value": { $type: 19 } } )

Examine el objeto constructor para determinar su tipo. Por ejemplo, la salida de db.collection.find() es un Cursor.

var findResults = db.housing.find({"multiUnit": true} )
findResults.constructor.name // Returns the type

Volver

Cambios de compatibilidad

En esta página