Tipos de JSON
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. |
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
$type
suporta utilizar estes valores para fazer uma query de campos pelo seu tipo de BSON.$type
também suporta o codinomenumber
, que corresponde aos tipos de BSON inteiro, decimal, double e longo.O operador de aggregation
$type
retorna o tipo BSON de seu argumento.O operador de aggregation
$isNumber
retornatrue
se 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 5 bytes gerado uma vez por processo. Este valor aleatório é exclusivo da máquina e do processo.
Um contador incrementador de 3 bytes, inicializado para um valor aleatório.
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.
No MongoDB, cada documento armazenado em uma coleção requer um campo _id exclusivo que atua como chave primária. Se um documento inserido omitir o campo _id
, o driver MongoDB gerará automaticamente um ObjectId para o campo _id
.
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:
Você pode acessar o tempo de criação de
ObjectId
emmongosh
usando o métodoObjectId.getTimestamp()
.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
_id
contendo valoresObjectId
é aproximadamente equivalente a classificar por hora de criação.Importante
Embora os valores de ObjectId devam aumentar com o tempo, eles não são necessariamente monotônicos. Isso ocorre porque eles:
Contêm apenas um segundo de resolução temporal, portanto, os valores de ObjectId criados no mesmo segundo não têm uma ordenação garantida, e
São gerados por clientes, que podem ter relógios de sistema diferentes.
Utilize os métodos ObjectId()
para configurar e recuperar valores ObjectId.
A partir do MongoDB 5.0, mongosh
substitui o shell legado mongo
. Os métodos ObjectId()
funcionam de maneira diferente em mongosh
e no shell mongo
herdado. Para obter mais informações sobre os métodos legados, consulte Legacy mongo Shell.
String
As strings JSON são UTF-8. Em geral, os drivers para cada linguagem de programação convertem do formato de cadeia de caracteres da linguagem para UTF-8 ao serializar e desserializar BSON. Isso torna possível armazenar a maioria dos caracteres internacionais em strings BSON com facilidade. [1] Além disso, as $regex
queries do MongoDB suportam UTF-8 na string regex.
[1] | Dadas strings usando conjuntos de caracteres UTF-8, usar sort() em strings será razoavelmente correto. No entanto, como internamente sort() usa a api de strcmp C++, a ordem de classificação pode manipular alguns caracteres incorretamente. |
Carimbos de data e hora
O BSON tem um tipo especial de carimbo de data/hora para uso interno do MongoDB e não está associado ao tipo normal de Data. Esse tipo de carimbo de data/hora interno é um valor de 64 bits em que:
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
ordinal
incremental 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.
Dentro de uma única instância do mongod
, os valores de carimbo de data/hora são sempre únicos.
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.
Observação
O tipo de carimbo de data/hora BSON é para uso interno do MongoDB. Na maioria dos casos, no desenvolvimento de aplicativos, você desejará usar o tipo de data BSON. Consulte Data para obter mais informações.
Ao inserir um documento que contenha campos de nível superior com valores de carimbo de data/hora vazios, o MongoDB substitui os valores de carimbo de data/hora vazios pelo valor de carimbo de data/hora atual pela seguinte exceção. Se o campo _id
contiver um valor de carimbo de data/hora vazio, ele sempre será inserido como está e não substituído.
Exemplo
Inserir um documento com um valor de carimbo de data/hora vazio:
db.test.insertOne( { ts: new Timestamp() } );
A execução do db.test.find()
retornaria um documento semelhante ao seguinte:
{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
O servidor substituiu o valor de carimbo de data/hora vazio por ts
pelo valor de carimbo de data/hora no momento da inserção.
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.
O tipo de data BSON está assinado. [2] Valores negativos representam datas anteriores a 1970.
Exemplo
Construa uma Data usando o construtor new Date()
em mongosh
:
var mydate1 = new Date()
Exemplo
Construa uma Data usando o construtor ISODate()
em mongosh
:
var mydate2 = ISODate()
Exemplo
Retorne o valor da Data como string:
mydate1.toString()
Exemplo
Retorna a parte mensal do valor da data; os meses são indexados a zero, então janeiro é o mês 0
:
mydate1.getMonth()
[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 intervalo 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. |