Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

JSON extendido

JSON es un formato de datos que representa los valores de objetos, arreglos, números, cadenas, booleanos y nulos. El formato Extended JSON define un conjunto reservado de claves con el prefijo "$" para representar la información del tipo de campo que corresponde directamente a cada tipo en BSON, el formato que MongoDB utiliza para almacenar datos.

MongoDB Extended JSON presenta diferentes formatos de string para representar los datos BSON. Cada uno de los diferentes formatos se ajusta al RFC de JSON y satisface casos de uso específicos. El formato extendido, también conocido como el formato canónico, presenta representaciones específicas para cada tipo BSON para una conversión bidireccional sin pérdida de información. El formato modo relajado es más conciso y se asemeja más al JSON ordinario, pero no representa toda la información de tipo, como el tamaño de bytes específico de los campos numéricos.

Consulte la siguiente tabla para ver una descripción de cada formato:

Nombre
Descripción

Extendido

También conocido como formato canónico, esta representación JSON evita la pérdida de información de tipo BSON.
Este formato prioriza la preservación de tipos a costa de la legibilidad y la interoperabilidad con formatos más antiguos.

Modo Relajado

Representación JSON que describe documentos BSON con cierta pérdida de información de tipo.
Este formato da prioridad a la facilidad de lectura humana y a la interoperabilidad a costa de perder cierta información sobre los tipos.

Shell

Representación JSON que coincide con la sintaxis utilizada en la consola de MongoDB.
Este formato prioriza la compatibilidad con la consola de MongoDB, que suele utilizar funciones de JavaScript para representar los tipos.

Estricto

Obsoleto. Esta representación es el formato antiguo que cumple totalmente con el estándar JSON RFC, lo que permite que cualquier analizador JSON lea la información de tipo.

Nota

El controlador analiza el tipo $uuid Extended JSON de un string a un objeto BsonBinary de subtipo binario 4. Para obtener más información sobre el análisis del campo $uuid, consulta la sección de reglas especiales para analizar los campos $uuid en la especificación JSON extendida.

Para obtener más información sobre JSON, BSON y JSON extendido, consulta nuestro artículo sobre JSON y BSON y JSON extendido en el manual de MongoDB Server.

Los siguientes ejemplos muestran un documento que contiene un campo ObjectId, una fecha y un número largo representado en cada formato Extendido de JSON. Haz clic en la pestaña que corresponda al formato del ejemplo que desees 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" }
}

Puedes leer una string extendida de JSON en un objeto de Python llamando al método bson.json_util.loads(). Este método analiza una string extendida de JSON y devuelve una lista de Python que contiene los datos.

El siguiente ejemplo muestra cómo se puede leer una string de JSON extendida en una lista de diccionarios utilizando el 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)}
]

En Python 3, el driver decodifica los valores binarios JSON con el subtipo 0 a instancias de la clase bytes. En Python 2, el controlador decodifica estos valores en instancias de la clase Binary con subtipo 0.

Los siguientes ejemplos de código muestran cómo PyMongo decodifica instancias binarias JSON con el subtipo 0. Selecciona la pestaña Python 2 o Python 3 para ver el código correspondiente:

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'}

Puedes guardar una string Extended JSON a partir de una lista de diccionarios llamando al método bson.json_util.dumps(). El siguiente ejemplo produce una string Extended JSON en formato Relajado:

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 defecto, el método dumps() devuelve la string Extended JSON en el formato Relaxed. Para especificar un formato diferente, pasa uno de los siguientes valores para el parámetro json_options:

  • CANONICAL_JSON_OPTIONS: Devuelve la string Extended JSON en formato canónico.

  • LEGACY_JSON_OPTIONS: Devuelve la string JSON extendida en formato heredado. Recomendamos utilizar el formato Relaxado o Canónico en su lugar.

El siguiente ejemplo muestra cómo producir JSON extendido en el formato estándar:

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"
}}}
]'''

Los recursos en las siguientes secciones ofrecen más información acerca de cómo trabajar con Extended JSON.

Para obtener más información sobre los métodos y tipos en bson.json_util, consulta la siguiente documentación de la API:

python-bsonjs es otro paquete, construido sobre libbson, que puede convertir BSON a JSON Extendido. El paquete python-bsonjs no depende de PyMongo y podría ofrecer una mejora de rendimiento sobre json_util en ciertos casos.

Tip

Utiliza el tipo RawBSONDocument

python-bsonjs funciona mejor con PyMongo al convertir del tipo RawBSONDocument.