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

Trabajar con datos JSON ampliados

En esta guía, puede aprender a utilizar el formato de datos JSON extendido cuando interactúe con documentos de MongoDB.

JSON es un formato de datos legible por humanos que representa los valores de objetos, arreglos, números, cadenas, booleanos y nulos. Este formato solo admite un subconjunto de tipos de datos BSON, que es el formato que utiliza MongoDB para almacenar datos. El formato Extended JSON admite más BSON types, definiendo un conjunto reservado de claves con el prefijo "$" para representar información del tipo de campo que corresponde directamente a cada tipo en BSON.

Para obtener más información sobre JSON, BSON y JSON extendido, consulta el recurso JSON y BSON y la entrada del manual JSON extendido de MongoDB Server.

MongoDB Extended JSON proporciona formatos de string para representar datos BSON. Cada formato cumple con la RFC JSON y satisface casos de uso específicos.

La siguiente tabla describe cada formato JSON extendido:

Nombre
Descripción

Extendido o Canónico

Formato de cadena que evita la pérdida de información de tipo BSON durante las conversiones de datos.
Este formato prioriza la preservación de tipos, aunque esto implique una menor legibilidad y una menor interoperabilidad con formatos anteriores. Para obtener más información sobre este formato, consulte JsonMode.EXTENDED en la documentación de la API.

Relajado

Formato de cadena que describe documentos BSON con cierta pérdida de información de tipo.
Este formato prioriza la legibilidad y la interoperabilidad, aunque a costa de perder información de tipo. El controlador Java Reactive Streams utiliza el modo Relaxed de forma predeterminada. Para obtener más información sobre este formato, consulte JsonMode.RELAXED en la documentación de la API.

Shell

Formato de cadena que coincide con la sintaxis utilizada en la consola de MongoDB.
Este formato prioriza la compatibilidad con la consola de MongoDB, que suele usar funciones de JavaScript para representar tipos. Para obtener más información sobre este formato, consulte JsonMode.SHELL en la documentación de la API.

Nota

El controlador Java Reactive Streams analiza el $uuid tipo JSON extendido de una cadena a un BsonBinary objeto de subtipo 4 binario. Para obtener más información sobre el $uuid análisis del campo, consulte la sección de reglas especiales para el análisis de campos $uuid en la especificación JSON extendida.

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")
}

Esta sección muestra cómo leer valores JSON extendidos en objetos Java de las siguientes maneras:

Para leer una string JSON extendida en un objeto de documento de Java, llame al método estático parse() de la clase Document o BsonDocument. Este método analiza la string JSON extendida y almacena sus datos en una instancia de la clase de documento especificada.

El siguiente ejemplo utiliza el método parse() para leer una cadena Extended JSON en un objeto Document:

String ejsonStr = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\" },"
+ " \"myNumber\": { \"$numberLong\": \"4794261\" } }";
Document doc = Document.parse(ejsonStr);
System.out.println(doc);

Para leer una string JSON extendida en objetos de Java sin usar las clases de documento, utilice la clase JsonReader de la librería BSON. Esta clase contiene métodos para analizar secuencialmente los campos y valores de la string JSON extendida y devolverlos como objetos de Java. Las clases de documentos del driver también utilizan esta clase para analizar JSON extendido.

El siguiente código utiliza métodos proporcionados por la clase JsonReader para convertir una string JSON extendida en objetos Java:

String string = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\" },"
+ " \"myNumber\": { \"$numberLong\": \"4794261\" } }";
JsonReader jsonReader = new JsonReader(string);
jsonReader.readStartDocument();
// Reads the "_id" field value
jsonReader.readName("_id");
ObjectId id = jsonReader.readObjectId();
// Reads the "myNumber" field value
jsonReader.readName("myNumber");
long myNumber = jsonReader.readInt64();
jsonReader.readEndDocument();
System.out.println(id + " is type: " + id.getClass().getName());
System.out.println(myNumber + " is type: " + Long.class.getName());
jsonReader.close();

Advertencia

Validar la entrada no confiable antes de convertir JSON a BSON.

Si convierte una string JSON a BSON y utiliza el BSON resultante en una query, una actualización o un comando, un atacante puede inyectar operadores o valores de campo inesperados que cambian el significado de la operación. Este riesgo es mayor cuando el JSON procede de un usuario, una solicitud de API o de otra fuente que no sea de confianza.

Para obtener más información sobre cómo validar la entrada antes de la conversión, consulte Validar la entrada no confiable antes de convertir JSON a BSON.

Esta sección muestra cómo guardar valores de Extended JSON a partir de objetos Java de las siguientes maneras:

Para guardar una cadena Extended JSON a partir de un objeto Document o BsonDocument, llama al método toJson(). Puedes pasar a este método un parámetro de objeto JsonWriterSettings para especificar el formato JSON ampliado.

El siguiente ejemplo escribe datos Document como JSON extendido en modo relajado:

Document doc = new Document()
.append("_id", new ObjectId("507f1f77bcf86cd799439012"))
.append("createdAt", Date.from(Instant.ofEpochMilli(1601499609000L)))
.append("myNumber", 4794261);
JsonWriterSettings settings = JsonWriterSettings.builder()
.outputMode(JsonMode.RELAXED)
.build();
System.out.println(doc.toJson(settings));

Para generar una string JSON extendida a partir de datos almacenados en objetos Java, puede usar la clase JsonWriter de la librería BSON. Para construir un objeto JsonWriter, pase una subclase de un Writer de Java para especificar cómo desea generar el JSON extendido. Opcionalmente, puede pasar una instancia de JsonWriterSettings para especificar opciones, como el formato JSON extendido. Por defecto, JsonWriter utiliza el formato de modo relajado. Las clases de documentos BSON también utilizan esta clase para convertir BSON a JSON extendido.

El siguiente ejemplo utiliza un objeto JsonWriter para crear valores de string Extended JSON en modo canónico y exportarlos a System.out:

JsonWriterSettings settings = JsonWriterSettings.builder()
.outputMode(JsonMode.EXTENDED)
.build();
JsonWriter jsonWriter = new JsonWriter(
new BufferedWriter(new OutputStreamWriter(System.out)), settings);
jsonWriter.writeStartDocument();
jsonWriter.writeName("_id");
jsonWriter.writeObjectId(new ObjectId("507f1f77bcf86cd799439012"));
jsonWriter.writeName("myNumber");
jsonWriter.writeInt64(11223344L);
jsonWriter.writeEndDocument();
jsonWriter.flush();

Además de especificar el formato de salida JSON extendido, puedes personalizar aún más la salida añadiendo convertidores a tu objeto JsonWriterSettings. Estos métodos convertidores especifican la lógica para manejar diferentes tipos de datos durante el proceso de conversión.

El siguiente ejemplo convierte el mismo documento que el ejemplo Utilizar las clases de documentos. Sin embargo, este ejemplo define los métodos de conversión objectIdConverter() y dateTimeConverter() en un objeto JsonWriterSettings para simplificar la salida JSON extendida en modo relajado:

JsonWriterSettings settings = JsonWriterSettings.builder()
.outputMode(JsonMode.RELAXED)
.objectIdConverter((value, writer) -> writer.writeString(value.toHexString()))
.dateTimeConverter((value, writer) -> {
ZonedDateTime zonedDateTime = Instant.ofEpochMilli(value).atZone(ZoneOffset.UTC);
writer.writeString(DateTimeFormatter.ISO_DATE_TIME.format(zonedDateTime));
})
.build();
Document doc = new Document()
.append("_id", new ObjectId("507f1f77bcf86cd799439012"))
.append("createdAt", Date.from(Instant.ofEpochMilli(1601499609000L)))
.append("myNumber", 4794261);
System.out.println(doc.toJson(settings));

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: