BSON es un formato de serialización binaria que se utiliza para almacenar documentos y realizar llamadas a procedimientos remotos en MongoDB. La especificación de BSON se encuentra en bsonspec.org..
Cada tipo de BSON tiene identificadores tanto enteros como de strings, como se enumeran en la siguiente tabla:
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. |
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" |
El
$typeEl operador admite el uso de estos valores para consultar campos por su tipo BSON.$typetambién admite elnumberalias, que coincide con los tipos BSON entero, decimal, doble y largo.El
$typeoperador de agregación devuelve el tipo BSON de su argumento.El operador de agregación
$isNumberdevuelvetruesi el argumento es un entero BSON, decimal, double o largo.
Para determinar el tipo de un campo, consulta Ver ilustrado de tipos en el shell mongo.
Para convertir BSON a JSON, consultar la referencia de Extended JSON.
Las siguientes secciones describen consideraciones especiales para BSON types.
ObjectId
Los ObjectIds son pequeños, probablemente únicos, rápidos de generar y ordenados. Los valores de ObjectId tienen una longitud de 12 bytes y consisten en:
Una marca de tiempo de 4 bytes, que representa la creación del ObjectId, medida en segundos desde la Unix epoch.
Un valor aleatorio de 5 bytes generado una vez por proceso. Este valor aleatorio es único para la máquina y el proceso.
Un contador incremental de 3bytes, inicializado con un valor aleatorio.
Para los valores de marca de tiempo y contador, los bytes más significativos aparecen primero en la secuencia de bytes (big-endian). Esto es diferente de otros valores de BSON, donde los bytes menos significativos aparecen primero (little-endian).
Si se utiliza un valor entero para crear un ObjectId, el entero reemplaza la marca de tiempo.
En MongoDB, cada documento almacenado en una colección requiere un campo _id único que actúa como clave principal. Si un documento insertado omite el _id campo, el controlador de MongoDB genera automáticamente un ObjectId para el _id campo.
Esto también se aplica a los documentos insertados mediante operaciones de actualización con inserción: true.
Los clientes de MongoDB deben añadir un campo _id con un ObjectId único. El uso de ObjectIds para el campo _id ofrece los siguientes beneficios adicionales:
Puedes acceder al tiempo de creación de
ObjectIdenmongoshutilizando el métodoObjectId.getTimestamp().Los ObjectIds están ordenados de forma aproximada por el tiempo de creación, pero no están perfectamente ordenados. Ordenar una colección en un campo
_idque contiene valoresObjectIdes aproximadamente equivalente a ordenar por tiempo de creación.Importante
Aunque los valores de ObjectId deberían aumentar con el tiempo, no son necesariamente monotónicos. Esto es porque ellos:
Solo contienen un segundo de resolución temporal, por lo que los valores ObjectId creados dentro del mismo segundo no tienen un orden garantizado y
Son generados por los clientes, que pueden tener relojes del sistema diferentes.
Utilice los ObjectId() métodos para establecer y recuperar valores de ObjectId.
A partir de MongoDB 5.0, mongosh reemplaza el shell heredado mongo. Los métodos ObjectId() funcionan de manera diferente en mongosh que en el shell mongo heredado. Para más información sobre los métodos heredados, consultar el Shell mongo heredado.
String
Las cadenas BSON son UTF-8. En general, los controladores de cada lenguaje de programación convierten del formato de string del lenguaje a UTF-8 al serializar y deserializar BSON. Esto hace posible almacenar con facilidad la mayoría de los caracteres internacionales en cadenas BSON. [1] Además, los query $regex de MongoDB admiten UTF-8 en la cadena regex.
| [1] | Dadas las cadenas de caracteres que utilizan conjuntos de caracteres UTF-8, usar sort() en las cadenas será razonablemente correcto. Sin embargo, debido a que internamente sort() utiliza la API de C++ strcmp, el orden de clasificación puede gestionar algunos caracteres de manera incorrecta. |
Marcas de tiempo
BSON tiene un tipo especial de marca de tiempo para uso interno de MongoDB y no está asociado con el tipo Date normal. Este tipo de marca de tiempo interno es un valor de 64 bits donde:
los 32 bits más significativos son un valor
time_t(segundos desde la Unix epoch)los 32 bits menos significativos son un
ordinalque incrementa para operaciones dentro de un segundo dado.
Aunque el formato BSON es de tipo little-endian y, por lo tanto, almacena primero los bits menos significativos, la instancia de mongod siempre compara el valor time_t antes que el valor ordinal en todas las plataformas, independientemente de la endianness.
En la replicación, el oplog tiene un campo ts. Los valores de este campo reflejan el operation time, que utiliza un valor de marca de tiempo BSON.
Dentro de una sola instancia de mongod, los valores de marca de tiempo en el oplog siempre son únicos.
Nota
El tipo de marca de tiempo BSON es para uso interno de MongoDB. En la mayoría de los casos, en el desarrollo de aplicaciones, es ideal usar el tipo de fecha BSON. Consultar Fecha para obtener más información.
fecha
BSON Date es un entero de 64 bits que representa la cantidad de milisegundos desde la Unix epoch (1 de enero de 1970). Esto da como resultado un rango de fechas representable de aproximadamente 290 millones de años hacia el pasado y el futuro.
La especificación oficial de BSON se refiere al tipo de dato BSON como fecha y hora UTC.
El tipo de fecha BSON es con signo. [2] Los valores negativos representan fechas anteriores a 1970.
Ejemplo
Construya una fecha usando el new Date() constructor mongosh en:
var mydate1 = new Date()
Ejemplo
Construya una fecha usando el ISODate() constructor mongosh en:
var mydate2 = ISODate()
Ejemplo
Devuelve el valor de fecha como cadena:
mydate1.toString()
Ejemplo
Devuelve la parte del mes del valor de fecha; los meses están indexados en cero, de modo que enero es el mes 0:
mydate1.getMonth()
| [2] | Antes de la versión 2.0, los valores Date se interpretaron incorrectamente como enteros sin signo, lo que afectó las clasificaciones, los query de rango y los índices en los campos Date. Debido a que los índices no se recrean al actualizar, vuelva a indexar si creó un índice sobre los valores de Date con una versión anterior, y las fechas anteriores a 1970 son relevantes para su aplicación. |