Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Mongo Shell heredado

Tipos de datos en el heredado mongo Shell

Advertencia

El siguiente documento se refiere a la mongo shell, incluida en la descarga del servidor MongoDB. Para obtener información sobre la nueva MongoDB Shell (mongosh), consulta la documentación de mongosh.

Para entender las diferencias entre los dos shells, consulte Comparación entre el mongo Shell y mongosh.

MongoDB BSON proporciona soporte para más tipos de datos que JSON. Drivers ofrecen soporte nativo para estos tipos de datos en los lenguajes host y la mongo shell también proporciona varias clases de asistencia para respaldar el uso de estos tipos de datos en la mongo shell de JavaScript. Consulta la referencia JSON extendido para obtener información adicional.

La mongo shell ofrece varios métodos para devolver la fecha, ya sea como una string o como un Date objeto:

  • 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().

Internamente, los objetos de fecha se almacenan como un entero de 64 bits con signo que representa el número de milisegundos desde la Unix epoch (1 de enero de 1970).

No todas las operaciones de base de datos y los controladores admiten el rango completo de 64 bits. Puedes trabajar de forma segura con fechas cuyos años estén dentro del rango inclusivo de 0 a 9999.

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.

El shell mongo envuelve objetos de tipo Date con el asistente ISODate; sin embargo, los objetos siguen siendo de 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, utilice el operador instanceof, como en el siguiente ejemplo:

myDate instanceof Date
myDateInitUsingISODateWrapper instanceof Date

La operación devuelve true para ambos.

El shell proporciona mongo la ObjectId() clase contenedora para el tipo de dato ObjectId. Para generar un nuevo ObjectId, utilice la siguiente operación en el mongo shell:

new ObjectId

Tip

Consulte:

El mongo shell considera todos los números como valores de punto flotante por defecto. El mongo shell proporciona el contenedor NumberLong() para gestionar enteros de 64bits.

El contenedor NumberLong() acepta el long como una string:

NumberLong("2090845886852")

Los siguientes ejemplos utilizan el NumberLong() contenedor para guardar en la colección:

db.collection.insertOne( { _id: 10, calc: NumberLong("2090845886852") } )
db.collection.updateOne( { _id: 10 },
{ $set: { calc: NumberLong("2555555000000") } } )
db.collection.updateOne( { _id: 10 },
{ $inc: { calc: NumberLong("5") } } )

Recupere el documento para verificarlo:

db.collection.findOne( { _id: 10 } )

En el documento devuelto, el campo calc contiene un objeto NumberLong:

{ "_id" : 10, "calc" : NumberLong("2555555000005") }

Si utilizas el $inc para incrementar el valor de un campo que contiene un objeto NumberLong con un float, el tipo de dato cambia a un valor de punto flotante, como en el siguiente ejemplo:

  1. Utilice $inc para incrementar el campo calc en 5, que el shell mongo trata como un float:

    db.collection.updateOne( { _id: 10 },
    { $inc: { calc: 5 } } )
  2. Retrieve the updated document:

    db.collection.findOne( { _id: 10 } )

    En el documento actualizado, el campo calc contiene un valor de punto flotante:

    { "_id" : 10, "calc" : 2555555000010 }

Nota

Aunque el constructor NumberLong() acepta valores integer desde el shell mongo (es decir, sin comillas), esto no es recomendable. Especificar un valor entero superior al Number.MAX_SAFE_INTEGER definido por JavaScript (que es el número 2^53 - 1) puede conllevar un comportamiento inesperado.

El mongo shell considera todos los números como valores de punto flotante por defecto. El shell mongo ofrece el constructor NumberInt() para especificar explícitamente enteros de 32bits.

Novedad en la versión 3.4.

El mongo shell trata todos los números como valores de double de punto flotante de 64bits por defecto. El shell mongo proporciona el constructor NumberDecimal() para especificar explícitamente valores de punto flotante de 128bits en formato decimal capaces de emular el redondeo con precisión exacta. Esta funcionalidad está destinada a aplicaciones que gestionan datos monetarios, como cálculos financieros, fiscales y científicos.

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

El constructor NumberDecimal() acepta el valor decimal como una cadena:

NumberDecimal("1000.55")

El valor se almacena en la base de datos de la siguiente manera:

NumberDecimal("1000.55")

El constructor NumberDecimal() también acepta valores double desde el shell mongo (por ejemplo, sin comillas), aunque no se recomienda debido al riesgo de pérdida de precisión. El constructor crea una representación de precisión double basada en binario del parámetro basado en decimal (potencialmente perdiendo precisión), luego convierte ese valor en un valor decimal con una precisión de 15 dígitos. El siguiente ejemplo pasa el valor implícitamente como un double y muestra cómo se crea con una precisión de 15 dígitos:

NumberDecimal(1000.55)

El valor se almacena en la base de datos de la siguiente manera:

NumberDecimal("1000.55000000000")

El siguiente ejemplo pasa el valor implícitamente como un double y muestra cómo puede ocurrir una pérdida de precisión:

NumberDecimal(9999999.4999999999)

El valor se almacena en la base de datos de la siguiente manera:

NumberDecimal("9999999.50000000")

Nota

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

Los valores del tipo decimal 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 es posible que no sean exactamente iguales a sus representaciones decimal, así que utiliza el constructor NumberDecimal() cuando verifiques la igualdad de los valores decimal. Considera los siguientes ejemplos con los siguientes documentos en la colección numbers:

{ "_id" : 1, "val" : NumberDecimal( "9.99" ), "description" : "Decimal" }
{ "_id" : 2, "val" : 9.99, "description" : "Double" }
{ "_id" : 3, "val" : 10, "description" : "Double" }
{ "_id" : 4, "val" : NumberLong("10"), "description" : "Long" }
{ "_id" : 5, "val" : NumberDecimal( "10.0" ), "description" : "Decimal" }

Cuando las consultas de la siguiente tabla se enchufan en el método db.numbers.find(<query>), se retornan los siguientes resultados:

Query
Resultados

{ "val": 9.99 }

{ "_id": 2, "val": 9.99, "description": "double" }

{ "val": NúmeroDecimal( "9.99" ) }

{ "_id": 1, "val": NumberDecimal( "9.99" ), "description": "Decimal" }

{ val: 10 }

{ "_id": 3, "val": 10, "description": "Double" }
{ "_id": 4, "val": NumberLong(10), "description": "Long" }
{ "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" }

{ val: NumberDecimal( "10" ) }

{ "_id": 3, "val": 10, "description": "Double" }
{ "_id": 4, "val": NumberLong(10), "description": "Long" }
{ "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" }

La primera consulta, { "val": 9.99 }, busca implícitamente la representación double de 9.99 que no sea igual a la representación decimal del valor.

El constructor NumberDecimal() se utiliza para query el documento con la representación decimal de 9.99. Los valores del tipo double se excluyen porque no coinciden exactamente con el valor de la representación decimal de 9.99.

Se devuelven valores coincidentes de todos los tipos numéricos al consultar números enteros. Por ejemplo, al consultar una representación double de 10, los resultados incluirán una representación decimal de 10.0 y viceversa.

Para probar el tipo decimal, utiliza el operador $type con el alias de cadena "decimal" o 19, el código numérico para el tipo decimal.

db.inventory.find( { price: { $type: "decimal" } } )

Para determinar el tipo de campos, el shell proporciona mongo los instanceof typeof operadores y.

instanceof Devuelve un valor booleano para probar si un valor es una instancia de algún tipo.

Por ejemplo, la siguiente operación prueba si el campo _id es una instancia del tipo ObjectId:

mydoc._id instanceof ObjectId

La operación devuelve true.

typeof devuelve el tipo de un campo.

Por ejemplo, la siguiente operación devuelve el tipo del campo _id:

typeof mydoc._id

En este caso typeof devolverá el tipo más genérico object en lugar del tipo ObjectId.

Volver

Escribir scripts para la shell de mongo

En esta página