Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Extended JSON

JSON é um formato de dados que representa os valores de objetos, arrays, números, strings, booleans e nulos. O formato Extended JSON define um conjunto reservado de chaves prefixadas com "$" para representar informações de tipos de campos que correspondem diretamente a cada tipo em BSON, o formato usado pelo MongoDB para armazenar dados.

O MongoDB Extended JSON oferece diferentes formatos de string para representar dados BSON. Cada um dos formatos está em conformidade com o JSON RFC e atende a casos de uso específicos. O formato estendido, também conhecido como o formato canônico, oferece representações específicas para cada tipo de BSON para fazer conversão bidirecional sem perda de informações. O formato modo Relaxed é mais conciso e semelhante ao JSON comum, mas não representa todas as informações de tipo, como o tamanho de byte específico de campos numéricos.

Consulte a tabela a seguir para ver uma descrição de cada formato:

Nome
Descrição

Extended

Também conhecido como o formato canônico, essa representação do JSON evita a perda de informações do tipo de BSON.
Esse formato prioriza a preservação do tipo na perda de legibilidade humana e interoperabilidade com formatos mais antigos.

Modo relaxado

Representação JSON que descreve documentos BSON com algum tipo de perda de informação.
Esse formato prioriza a legibilidade humana e a interoperabilidade na perda de determinados tipos de informações.

Shell

Representação JSON que corresponde à sintaxe usada no MongoDB shell.
Esse formato prioriza a compatibilidade com o shell do MongoDB , que frequentemente usa funções JavaScript para representar tipos.

Strict

Obsoleto. Essa representação é o formato legado que está totalmente em conformidade com o JSON RFC que permite a qualquer analisador JSON ler as informações de tipos.

Observação

O driver analisa o tipo de JSON estendido $uuid de uma string para um objeto BsonBinary de subtipo binário 4. Para obter mais informações sobre a análise do campo $uuid, consulte a seção regras especiais para analisar campos $uuid na especificação de JSON estendida.

Para saber mais sobre JSON, BSON e Extended JSON, consulte nosso artigo sobre JSON, BSON e Extended JSON no manual do MongoDB Server .

Os exemplos abaixo mostram um documento contendo um campo de ObjectId, data e número longo representado em cada formato Extended JSON. Clique na aba correspondente ao formato do exemplo que deseja ver:

{
"_id": { "$oid": "573a1391f29313caabcd9637" },
"createdAt": { "$date": { "$numberLong": "1601499609" }},
"numViews": { "$numberLong": "36520312" }
}
{
"_id": { "$oid": "573a1391f29313caabcd9637" },
"createdAt": { "$date": "2020-09-30T18:22:51.648Z" },
"numViews": 36520312
}
{
"_id": ObjectId("573a1391f29313caabcd9637"),
"createdAt": ISODate("2020-09-30T18:22:51.648Z"),
"numViews": NumberLong("36520312")
}
{
"_id": { "$oid": "573a1391f29313caabcd9637" },
"createdAt": { "$date": 1601499609 },
"numViews": { "$numberLong": "36520312" }
}

Você pode ler uma string de Extended JSON em um objeto Python chamando o método bson.json_util.loads(). Este método analisa uma string de JSON estendida e retorna uma lista Python contendo os dados.

O exemplo seguinte mostra como você pode ler uma string de Extended JSON em uma lista de dicionários utilizando o método loads():

from bson.json_util import loads
ejson_str = '''[
{"foo": [1, 2]},
{"bar": {"hello": "world"}},
{"code": {
"$scope": {},
"$code": "function x() { return 1; }"
}},
{"bin": {
"$type": "80",
"$binary": "AQIDBA=="
}}
]'''
doc = loads(ejson_str)
print(doc)
[
{'foo': [1, 2]},
{'bar': {'hello': 'world'}},
{'code': Code('function x() { return 1; }', {})},
{'bin': Binary(b'\x01\x02\x03\x04', 128)}
]

No Python 3, o driver decodifica valores binários JSON com subtipo 0 para instâncias da classe bytes. No Python 2, o driver decodifica esses valores para instâncias da classe Binary com subtipo 0.

Os exemplos de código a seguir mostram como o PyMongo decodifica instâncias binárias JSON com subtipo 0. Selecione a aba Python 2 ou Python 3 para visualizar o código correspondente:

from bson.json_util import loads
doc = loads('{"b": {"$binary': b'this is a byte string'})
print(doc)
{u'b': Binary('this is a byte string', 0)}
from bson.json_util import loads
doc = loads('{"b": {"$binary': b'this is a byte string'})
print(doc)
{'b': b'this is a byte string'}

Você pode gravar uma string de JSON estendida a partir de uma lista de dicionários chamando o método bson.json_util.dumps(). O exemplo a seguir gera uma string de Extended JSON no formato Relaxed:

from bson import Code, Binary
from bson.json_util import dumps
doc = [
{'foo': [1, 2]},
{'bar': {'hello': 'world'}},
{'code': Code('function x() { return 1; }', {})},
{'bin': Binary(b'\x01\x02\x03\x04', 128)}
]
ejson_str = dumps(doc)
print(ejson_str)
'''[
{"foo": [1, 2]},
{"bar": {"hello": "world"}},
{"code": {
"$code": "function x() { return 1; }",
"$scope": {}
}},
{"bin": {
"$binary": {
"base64": "AQIDBA==",
"subType": "80"
}}}
]'''

Por padrão, o método dumps() retorna a string de JSON estendida no formato relaxado. Para especificar um formato diferente, passe um dos seguintes valores para o parâmetro json_options:

  • CANONICAL_JSON_OPTIONS: retorna a string de JSON estendida no formato canônico.

  • LEGACY_JSON_OPTIONS: retorna a string de JSON estendida no formato legado. Recomendamos usar o formato Relaxed ou Canonical.

O exemplo a seguir mostra como gerar JSON estendido no formato canônico:

from bson import Code, Binary
from bson.json_util import dumps, CANONICAL_JSON_OPTIONS
doc = [
{'foo': [1, 2]},
{'bar': {'hello': 'world'}},
{'code': Code('function x() { return 1; }', {})},
{'bin': Binary(b'\x01\x02\x03\x04', 128)}
]
ejson_str = dumps(doc, json_options=CANONICAL_JSON_OPTIONS)
print(ejson_str)
'''[
{"foo": [
{"$numberInt": "1"},
{"$numberInt": "2"}
]},
{"bar": {"hello": "world"}},
{"code": {
"$code": "function x() { return 1; }",
"$scope": {}
}},
{"bin": {
"$binary": {
"base64": "AQIDBA==",
"subType": "80"
}}}
]'''

Os recursos nas seções a seguir fornecem mais informações sobre como trabalhar com JSON estendido.

Para obter mais informações sobre os métodos e tipos em bson.json_util, consulte a seguinte documentação da API:

python-bsonjs é outro pacote, criado sobre libbson, que pode converter BSON em Extended JSON. O pacote python-bsonjs não depende do PyMongo e pode oferecer uma melhoria de desempenho em relação ao json_util em determinados casos.

Dica

Usar o tipo de documento RawBSONDocument

python-bsonjs funciona melhor com o PyMongo ao converter do tipo RawBSONDocument.