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

Formato de datos de documento: JSON extendido

En esta guía, puedes aprender a usar el formato JSON extendido en el controlador MongoDB Kotlin.

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.

Esta guía explica los siguientes temas:

  • Los diferentes formatos JSON extendidos de MongoDB

  • Cómo usar la librería BSON para convertir entre JSON extendido y objetos Kotlin

  • Cómo crear una conversión personalizada de BSON types

Para más información sobre la diferencia entre estos formatos, consulta nuestro artículo sobre JSON y BSON.

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 heredado que se ajusta completamente al RFC de JSON, lo que permite que cualquier analizador de JSON lea la información de tipo.
La API heredada utiliza este formato.

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 información más detallada sobre estos formatos, consulte los siguientes recursos:

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 cadena Extended JSON en un objeto de documento Kotlin llamando al método estático parse() de la clase Document o BsonDocument, dependiendo del tipo de objeto Realm que necesites. Este método analiza la string Extended JSON en cualquiera de los formatos y devuelve una instancia de esa clase que contiene los datos.

El siguiente ejemplo muestra cómo puedes usar la clase Document para leer una string JSON extendida de ejemplo en un objeto Document usando el método parse():

val ejsonStr = """
{ "_id": { "${"$"}oid": "507f1f77bcf86cd799439011"},
"myNumber": {"${"$"}numberLong": "4794261" }}
""".trimIndent()
val doc = Document.parse(ejsonStr)
println(doc)
Document{{_id=507f1f77bcf86cd799439011, myNumber=4794261}}

Para obtener más información, consulte nuestra página de Fundamentos en la Guía de documentos.

También puedes leer una string Extended JSON a objetos de Kotlin sin utilizar las clases de documento del driver MongoDB Kotlin usando la clase JsonReader. Esta clase contiene métodos para analizar secuencialmente los campos y valores en cualquier formato de la string Extended JSON, y los devuelve como objetos de Kotlin. Las clases de documentos del driver también utilizan esta clase para analizar JSON extendido.

El siguiente ejemplo de código muestra cómo puede usar la clase JsonReader para convertir una cadena JSON extendida en objetos de Kotlin:

val ejsonStr = """
{ "_id": { "${"$"}oid": "507f1f77bcf86cd799439011"},
"myNumber": {"${"$"}numberLong": "4794261" }}
""".trimIndent()
val jsonReader = JsonReader(ejsonStr)
jsonReader.readStartDocument()
jsonReader.readName("_id")
val id = jsonReader.readObjectId()
jsonReader.readName("myNumber")
val myNumber = jsonReader.readInt64()
jsonReader.readEndDocument()
println(id.toString() + " is type: " + id.javaClass.name)
println(myNumber.toString() + " is type: " + myNumber.javaClass.name)
jsonReader.close()
507f1f77bcf86cd799439011 is type: org.bson.types.ObjectId
4794261 is type: java.lang.Long

Para más información, consulta la JsonReader Documentación de la API.

Se puede crear una string Extended JSON a partir de una instancia de Document o BsonDocument llamando al método toJson(), pasando opcionalmente una instancia de JsonWriterSettings para especificar el formato Extended JSON.

En este ejemplo, producimos el JSON extendido en el formato de modo relajado.

val myDoc = Document().append("_id", ObjectId("507f1f77bcf86cd799439012"))
.append("myNumber", 11223344)
val settings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build()
myDoc.toJson(settings)
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": 11223344}

También puedes generar una Extended JSON string a partir de datos en objetos de Kotlin utilizando la librería BSON con la clase JsonWriter. Para construir una instancia de JsonWriter, pasa una subclase de una Writer Java para especificar cómo deseas generar la salida del extended JSON. Opcionalmente, se puede pasar una instancia de JsonWriterSettings para especificar opciones como el formato JSON extendido. Por defecto, el JsonWriter utiliza el formato de modo relajado. Las clases de documentos del driver MongoDB Kotlin también usan esta clase para convertir BSON a JSON extendido.

El siguiente ejemplo de código muestra cómo puedes usar JsonWriter para crear una string JSON extendida y enviarla a System.out. Especificamos el formato pasando el método builder outputMode() la constante JsonMode.EXTENDED:

val settings = JsonWriterSettings.builder().outputMode(JsonMode.EXTENDED).build()
JsonWriter(BufferedWriter(OutputStreamWriter(System.out)), settings).use { jsonWriter ->
jsonWriter.writeStartDocument()
jsonWriter.writeObjectId("_id", ObjectId("507f1f77bcf86cd799439012"))
jsonWriter.writeInt64("myNumber", 11223344)
jsonWriter.writeEndDocument()
jsonWriter.flush()
}
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": {"$numberLong": "11223344"}}

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de la API:

Además de especificar el outputMode() para el formato de la salida JSON, puedes personalizar aún más la salida añadiendo convertidores a tu JsonWriterSettings.Builder. Estos métodos de conversión detectan los tipos de Kotlin y ejecutan la lógica definida por el Converter que se les pasa.

El siguiente código de muestra muestra cómo añadir convertidores, definidos como expresiones Lambda, para simplificar la salida JSON en el modo relajado.

val settings = JsonWriterSettings.builder()
.outputMode(JsonMode.RELAXED)
.objectIdConverter { value, writer -> writer.writeString(value.toHexString()) }
.timestampConverter { value, writer ->
val ldt = LocalDateTime.ofInstant(Instant.ofEpochSecond(value.time.toLong()), ZoneOffset.UTC)
writer.writeString(ldt.format(DateTimeFormatter.ISO_DATE_TIME))
}
.build()
val doc = Document()
.append("_id", ObjectId("507f1f77bcf86cd799439012"))
.append("createdAt", BsonTimestamp(1601516589,1))
.append("myNumber", 4794261)
println(doc.toJson(settings))
{"_id": "507f1f77bcf86cd799439012", "createdAt": "2020-10-01T01:43:09", "myNumber": 4794261}
// Without specifying the converters, the Relaxed mode JSON output
// should look something like this:
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "createdAt": {"$timestamp": {"t": 1601516589, "i": 1}}, "myNumber": 4794261}

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de la API: