BSON é um formato de serialização binária usado para armazenar documentos e fazer chamadas de procedimento remoto no MongoDB. A especificação BSON está localizada em bsonspec.org.
Cada tipo de BSON tem identificadores de número inteiro e de string, conforme listado na tabela a seguir:
Tipo | Número | Alias | Notas |
|---|---|---|---|
Double | 1 | "double" | |
String | 2 | "string" | |
Objeto | 3 | "objeto" | |
Array | 4 | "array" | |
Dados binários | 5 | "binData" | |
Indefinido | 6 | " indefinido " | Obsoleto. |
ObjectId | 7 | "objectId" | |
Boolean | 8 | "bool" | |
Data | 9 | "data" | |
Zero | 10 | "nulo" | |
Expressão regular | 11 | "regex" | |
DBPointer | 12 | "dbPointer" | Obsoleto. |
JavaScript | 13 | "javascript" | |
Símbolo | 14 | "símbolo" | Obsoleto. |
JavaScript com escopo | 15 | "javascriptWithScope" | Obsoleto. |
Inteiro de bits | 16 | "int" | |
Timestamp | 17 | " carimbo de data/hora " | |
Inteiro de 64 bits | 18 | "long" | |
Decimal128 | 19 | "decimal" | |
Min key | -1 | "minKey" | |
Tecla máxima | 127 | "maxKey" |
O operador de aggregation
$typeretorna o tipo BSON de seu argumento.O operador de aggregation
$isNumberretornatruese seu argumento for um inteiro BSON, decimal, double ou longo. Novidades na versão 4,4
Para determinar o tipo de um campo, consulte Verificação de tipo.
Se você converter BSON em JSON, consulte a referência de JSON estendido .
As seções a seguir descrevem considerações especiais para tipos específicos de BSON.
Dados binários
Um valor binário BSON binData é uma array de bytes. Um valor binData tem um subtipo que indica como interpretar os dados binários. A tabela a seguir mostra os subtipos.
Número | Subtipo |
|---|---|
0 | Subtipo binário genérico |
1 | Dados de Função |
2 | Binário (antigo) |
3 | UUID (antigo) |
4 | UUID |
5 | md5 |
6 | Valor BSON criptografado |
7 | Dados de série temporal compactados Novidades na versão 5.2. |
128 | Dados personalizados |
ObjectId
ObjectIds são pequenos, provavelmente únicos, rápidos de gerar e ordenados. Os valores ObjectId têm 12 bytes de comprimento, consistindo em:
Um carimbo de data/hora de bytes, representando a criação do ObjectID, medido em segundos desde a época do Unix.
Um valor aleatório de 5bytes gerado uma vez por processo do lado do cliente. Este valor aleatório é exclusivo da máquina e do processo. Se o processo reiniciar ou o nó primário do processo mudar, este valor será gerado novamente.
Um contador de incremento de 3bytes por processo do lado do cliente, inicializado com um valor aleatório. O contador é reiniciado quando um processo é reiniciado.
Para valores de carimbo de data/hora e contador, os bytes mais significativos aparecem primeiro na sequência de bytes (big-endian). Isto é diferente de outros valores de BSON, onde os bytes menos significativos aparecem primeiro (little-endian).
Se um valor inteiro for usado para criar um ObjectId, o número inteiro substituirá o carimbo de data/hora.
In MongoDB, each document stored in a standard collection requires a unique _id field that acts as a primary key. If an inserted document omits the _id field, the MongoDB driver automatically generates an ObjectId for the _id field.
Isso também se aplica a documentos inseridos por meio de operações de atualização com upsert: true.
Os clientes do MongoDB devem adicionar um campo _id com um ObjectId único. A utilização de ObjectIds para o campo _id fornece os seguintes benefícios adicionais:
You can access
ObjectIdcreation time inmongoshusing theObjectId.getTimestamp()method.Os ObjectIDs são aproximadamente ordenados por hora de criação, mas não estão perfeitamente ordenados. Classificar uma coleção em um campo
_idcontendo valoresObjectIdé aproximadamente equivalente a classificar por hora de criação.Importante
While ObjectId values should increase over time, they are not necessarily monotonic. This is because they:
Only contain one second of temporal resolution, so ObjectId values created within the same second do not have a guaranteed ordering, and
São gerados por clientes, que podem ter relógios de sistema diferentes.
Utilize os métodos ObjectId() para configurar e recuperar valores ObjectId.
Starting in MongoDB 5.0, mongosh replaces the legacy mongo shell. The ObjectId() methods work differently in mongosh than in the legacy mongo shell. For more information on the legacy methods, see Legacy mongo Shell.
String
BSON strings are UTF-8. In general, drivers for each programming language convert from the language's string format to UTF-8 when serializing and deserializing BSON. This makes it possible to store most international characters in BSON strings with ease. [1] In addition, MongoDB $regex queries support UTF-8 in the regex string.
| [1] | Dadas strings usando conjuntos de caracteres UTF-8, usar sort() em strings é razoavelmente correto. No entanto, como internamente sort() usa a API strcmp C++, a ordem de classificação pode lidar com alguns caracteres incorretamente. |
Carimbos de data e hora
BSON has a special timestamp type for internal MongoDB use and is not associated with the regular Date type. This internal timestamp type is a 64 bit value where:
os 32 bits mais significativos são um valor de
time_t(segundos desde a época Unix)os 32 bits menos significativos são um
ordinalincremental para operações dentro de um determinado segundo.
Enquanto o formato BSON é little-endian e, portanto, armazena os bits menos significativos primeiro, a instância mongod sempre compara o valor time_t antes do valor ordinal em todas as plataformas, independentemente da endianidade.
Na replicação, o oplog tem um campo ts. Os valores neste campo refletem o tempo de operação, que utiliza um valor de carimbo de data/hora BSON.
Dentro de uma única instância mongod, os valores de timestamp no oplog são sempre únicos.
Observação
The BSON timestamp type is for internal MongoDB use. For most cases, in application development, use the BSON date type. See Date for more information.
Data
Data de JSON é um número inteiro de 1 bits que representa o número de milissegundos desde a época do Unix (1 de janeiro de 1970). Isso resulta em um período representável de cerca de 290 milhões de anos no passado e no futuro.
A especificação oficial da BSON refere-se ao tipo BSON Date como data e hora UTC.
BSON Date type is signed. [2] Negative values represent dates before 1970.
To construct a Date in mongosh, you can use the new Date() or ISODate() constructor.
Construa uma Data com o novo construtor Date()
Para construir um Date com o construtor new Date(), execute o seguinte comando:
var mydate1 = new Date()
A variável mydate1 gera uma data e hora encapsuladas como um ISODate:
mydate1
ISODate("2020-05-11T20:14:14.796Z")
Construa uma Data com o construtor ISODate()
Para construir uma Date usando o construtor ISODate(), execute o seguinte comando:
var mydate2 = ISODate()
A variável mydate2 armazena uma data e hora encapsuladas como um ISODate:
mydate2
ISODate("2020-05-11T20:14:14.796Z")
Converter uma data em uma string
Para imprimir a Date no formato string, utilize o método toString():
mydate1.toString()
Mon May 11 2020 13:14:14 GMT-0700 (Pacific Daylight Time)
Retorne a parte do mês de uma data
Você também pode retornar a parte do mês do valor Date. Os meses são indexados em zero, então janeiro é o mês 0.
mydate1.getMonth()
4
| [2] | Antes da versão 2.0, os valores Date eram interpretados incorretamente como números inteiros sem sinal, o que afetava as classificações, as queries de faixa e os índices nos campos Date. Como os índices não são recriados durante a atualização, reindexe se tiver criado um índice sobre os valores Date com uma versão anterior e se as datas anteriores a 1970 forem relevantes para o seu aplicativo. |
decimal128 Tipo de dados BSON
decimal128 é uma representação decimal de 128 bits para armazenar números muito grandes ou muito precisos, sempre que o arredondamento de decimais for importante. Foi criado em agosto de 2009 como parte da revisão IEEE 754-2008 de pontos flutuantes. Quando precisar de alta precisão ao trabalhar com tipos de dados BSON, você deve usar decimal128.
decimal128 suporte para 34 dígitos decimais de precisão ou mantissa com uma faixa de expoentes de -6143 a +6144. A mantissa não é normalizada no padrão decimal128, permitindo várias representações possíveis: 10 x 10^-1 = 1 x 10^0 = .1 x 10^1 = .01 x 10^2, etc. Ter a capacidade de armazenar valores máximos e mínimos na ordem de 10^6144 e 10^-6143, respectivamente, permite uma grande precisão.
Use decimal128 com o construtor Decimal128()
No MongoDB, é possível armazenar dados no formato decimal128 utilizando o construtor Decimal128(). Se você passar o valor decimal como uma string, o MongoDB armazenará o valor no banco de dados da seguinte forma:
Decimal128("9823.1297")
Você também pode passar o valor decimal como um double:
Decimal128.fromStringWithRounding("1234.99999999999")
Você também deve considerar o uso e o suporte que a sua linguagem de programação oferece para decimal128. As seguintes linguagens não oferecem suporte nativo a este recurso e exigem um plugin ou pacote adicional para obter a funcionalidade:
Python: O módulo decimal.Decimal pode ser usado para aritmética de ponto flutuante.
Java: a classe Java BigDecimal oferece suporte para
decimal128números.Node.js: Existem vários pacotes que oferecem suporte, como js-big-decimal ou node.js bigdecimal disponíveis em npm.
Casos de uso
Quando você realiza cálculos matemáticos programaticamente, pode às vezes obter resultados inesperados. O exemplo a seguir em Node.js gera resultados incorretos:
> 0.1 0.1 > 0.2 0.2 > 0.1 * 0.2 0.020000000000000004 > 0.1 + 0.1 0.010000000000000002
Da mesma forma, o exemplo a seguir em Java gera uma saída incorreta:
1 class Main { 2 public static void main(String[] args) { 3 System.out.println("0.1 * 0.2:"); 4 System.out.println(0.1 * 0.2); 5 } 6 }
1 0.1 * 0.2: 2 0.020000000000000004
Os mesmos cálculos em Python, Ruby, Rust e outras linguagens produzem os mesmos resultados. Isso acontece porque números de ponto flutuante binário não representam bem os valores na base 10.
Por exemplo, o 0.1 utilizado nos exemplos acima é representado em binário como 0.0001100110011001101. Na maioria dos casos, isso não causa problemas consideráveis. No entanto, em aplicativos de finanças ou bancos, por exemplo, onde a precisão é fundamental, use decimal128 como seu tipo de dados.
BSON com drivers MongoDB
Para ver como drivers específicos lidam com o BSON, consulte a documentação do driver: