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.
fecha
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 objetoDateusando el contenedorISODate().ISODate()constructor que devuelve un objetoDateusando el contenedorISODate().
ObjectId
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
Double
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().
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.
Long
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" } )
Decimal128
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.
Igualdad y orden de clasificación
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.
Marca de tiempo
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 |
|---|---|---|---|
| entero | Tiempo actual desde UNIX epoch. | Opcional. Un tiempo en segundos. |
| entero | 1 | Opcional. Se utiliza para ordenar cuando hay múltiples operaciones dentro de un segundo dado. |
Para ejemplos de uso, vea Establecer una marca de tiempo en un documento nuevo, Crear una marca de tiempo personalizada.
Verificación de tipos
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.
Ejemplos
Fecha de devolución como string
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.
Fecha de devolución
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.
Tipos numéricos
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 | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| | |||||||||||||||||||||||||||||||
| | |||||||||||||||||||||||||||||||
| | |||||||||||||||||||||||||||||||
| | |||||||||||||||||||||||||||||||
| | |||||||||||||||||||||||||||||||
| | |||||||||||||||||||||||||||||||
| |
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.
Coherencia de tipos numéricos por defecto
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 } ]
Añadir una marca de tiempo a un nuevo documento
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 }) } ]
Cree una marca de tiempo personalizada
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 }) } ]
Comprobación de tipos con $type()
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 } } )
Comprobación de tipos con un constructor
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