Advertencia
El siguiente documento se refiere a la mongo Shell, incluido en la descarga del servidor MongoDB. Para obtener información sobre el nuevo Shell MongoDB (),mongosh consulte la documentación de Mongosh.
Para comprender las diferencias entre las dos capas, consulte Comparación de las mongo capas mongosh y.
MongoDB BSON admite tipos de datos adicionales a JSON. Loscontroladores ofrecen compatibilidad nativa con estos tipos de datos en los lenguajes host, y el mongo shell también proporciona varias clases auxiliares para el uso de estos tipos de datos en el mongo shell JavaScript. Consulte la referencia de JSON extendido para obtener más información.
Tipos
fecha
El shell proporciona varios métodos para devolver la fecha, ya sea como una cadena o como mongo un Date objeto:
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().
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.
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.
Return Date
El shell envuelve objetos mongo de Date tipo con el ISODate ayudante; sin embargo, los objetos siguen siendo de Date tipo.
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.
ObjectId
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
Número largo
El shellmongotrata todos los números como valores de punto flotante por defecto. El shellmongoproporciona el contenedor NumberLong() para manejar enteros de 64bits.
El contenedor NumberLong() acepta long como una cadena:
NumberLong("2090845886852")
Los siguientes ejemplos utilizan el contenedor NumberLong() para escribir 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") } } )
Recuperar el documento a verificar:
db.collection.findOne( { _id: 10 } )
En el documento devuelto, el campo calc contiene un objeto NumberLong:
{ "_id" : 10, "calc" : NumberLong("2555555000005") }
Si utiliza para incrementar el valor de un campo que contiene $inc un NumberLong objeto en un punto flotante, el tipo de datos cambia a un valor de punto flotante, como en el siguiente ejemplo:
Utilice para incrementar
$incelcalccampo5en, que el shell trata como unmongoflotante:db.collection.updateOne( { _id: 10 }, { $inc: { calc: 5 } } ) Retrieve the updated document:
db.collection.findOne( { _id: 10 } ) En el documento actualizado, el campo
calccontiene un valor de punto flotante:{ "_id" : 10, "calc" : 2555555000010 }
Nota
Aunque el NumberLong() constructor acepta integer valores del mongo shell (es decir, sin comillas), no se recomienda. Especificar un valor entero mayor que el valor definido en JavaScript Number.MAX_SAFE_INTEGER (que es el 2^53 - 1 número) puede generar un comportamiento inesperado.
Número entero
El shellmongotrata todos los números como valores de punto flotante por defecto. El shellmongoproporciona el constructor NumberInt() para especificar explícitamente enteros de 32bits.
NumberDecimal
Nuevo en la versión 3.4.
El shell trata todos los números como mongo valores 64de coma flotante de bits double por defecto. El shell proporciona mongo el NumberDecimal() constructor para especificar explícitamente 128valores de coma flotante de bits basados en decimales capaces de emular el redondeo decimal con precisión exacta. Esta funcionalidad está diseñada para aplicaciones que manejan datos monetarios, como cálculos financieros, fiscales y científicos.
El decimal tipo BSON utiliza el 754 128 formato de numeración de punto flotante IEEE decimal que admite 34 dígitos decimales (es decir, dígitos significativos) y un rango de exponente de −6143 a6144 +.
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 NumberDecimal() constructor también acepta double valores del shell (es decir, sin comillas), aunque no se recomienda debido al riesgo de perder precisión. El constructor crea una representación binaria mongo con double precisión del parámetro decimal (lo que podría causar pérdida de precisión) y luego convierte ese valor en un decimal valor con una precisión de 15 dígitos. El siguiente ejemplo pasa el valor implícitamente como 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 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.
Igualdad y orden de clasificación
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 decimales y pueden no ser exactamente iguales a sus representaciones decimal; por lo tanto, utilice el constructor NumberDecimal() al comprobar la igualdad de los valores decimal. Considere los siguientes ejemplos con los siguientes documentos de 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 tabla a continuación se conectan al método db.numbers.find(<query>), se devuelven los siguientes resultados:
Query | Resultados |
|---|---|
{ "val": 9.99 } | { "_id": 2, "val": 9.99, "description": "Doble" } |
{ "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: NúmeroDecimal( "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.
Al consultar números enteros, se devuelven valores coincidentes de todos los tipos numéricos. Por ejemplo, al consultar una representación double de 10, se incluirá una representación decimal de 10.0 en los resultados, y viceversa.
Comprobando el decimal tipo
decimal Para probar $type "decimal" 19el decimal tipo, utilice el operador con el alias de cadena o, el código numérico para el tipo.
db.inventory.find( { price: { $type: "decimal" } } )
Tipos de comprobación en el mongo shell
Para determinar el tipo de campos, el shell proporciona mongo los instanceof typeof operadores y.
instanceof
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
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 object más genérico en lugar del tipo ObjectId.