Docs Menu
Docs Home
/ /

Formato de datos del documento: clases de datos

En esta guía, puede aprender cómo almacenar y recuperar datos en el controlador de sincronización MongoDB Kotlin mediante el uso de clases de datos Kotlin.

El controlador admite de forma nativa la codificación y decodificación de clases de datos Kotlin para operaciones de lectura y escritura en MongoDB mediante el registro de códecs predeterminado. Este registro es una colección de clases denominadas códecs que definen cómo codificar y decodificar tipos de Kotlin y Java.

Los ejemplos de código de esta sección hacen referencia a la siguiente clase de datos de muestra, que describe un dispositivo de almacenamiento de datos:

data class DataStorage(val productName: String, val capacity: Double)

Puedes insertar un DataStorage instancia como se muestra en el siguiente código:

val collection = database.getCollection<DataStorage>("data_storage")
val record = DataStorage("tape", 5.0)
collection.insertOne(record)

Puede recuperar documentos como instancias DataStorage e imprimirlos como se muestra en el siguiente código:

val result = collection.find().firstOrNull()
println("${result}")
DataStorage(productName=tape, capacity=5.0)

Tip

Métodos de construcción y propiedades de la clase de datos

Puede usar los métodos de las clases de constructor directamente con las propiedades de la clase de datos añadiendo la dependencia opcional de extensiones del controlador Kotlin Sync a su aplicación. Para obtener más información y ver ejemplos, consulte Guía deuso de constructores con clases de datos.

Debe especificar una clase para los documentos devueltos desde una colección, incluso si es diferente de la clase que especificó al recuperar la colección.

El siguiente ejemplo actualiza el documento representado por la clase de datos DataStorage en el ejemplo anterior y devuelve el documento actualizado como tipo DataStorageAlt. La operación añade el campo releaseDate al documento cuyo valor del campo name es tape:

// Define a data class for returned documents
data class DataStorageAlt(
val productName: String,
val capacity: Double,
val releaseDate: LocalDate
)
val filter = Filters.eq(DataStorage::productName.name, "tape")
val update = Updates.currentDate("releaseDate")
val options = FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)
// Specify the class for returned documents
val newResult = collection
.withDocumentClass<DataStorageAlt>()
.findOneAndUpdate(filter, update, options)
println("Document after update:\n${newResult}")
Document after update:
DataStorageAlt(productName=tape, capacity=5.0, releaseDate=2025-01-24)

Esta sección describe las anotaciones que puede utilizar para configurar el comportamiento de serialización de las clases de datos y proporciona un ejemplo para demostrar el comportamiento de la anotación.

Puede utilizar las siguientes anotaciones en las clases de datos:

Nombre de la anotación
Descripción

BsonId

Marca una propiedad para serializar como la propiedad _id.

BsonProperty

Especifica un nombre de campo de documento personalizado al convertir el campo de clase de datos a BSON.

BsonRepresentation

Especifica el tipo BSON que MongoDB utiliza para almacenar el valor. Use esta anotación solo cuando deba almacenar un valor con un tipo BSON diferente al de la propiedad de la clase de datos.

ADVERTENCIA: Su código puede generar una excepción si incluye la BsonRepresentation anotación en una propiedad que almacena como del mismo tipo que la propiedad de la clase de datos.

Para obtener más información sobre estas anotaciones de propiedades, consulte la Documentación de la API del paqueteorg.bson.codecs.pojo.annotations.

Los ejemplos de código de esta sección hacen referencia a la siguiente clase de datos de muestra, que describe un dispositivo de red:

data class NetworkDevice(
@BsonId
@BsonRepresentation(BsonType.OBJECT_ID)
val deviceId: String,
val name: String,
@BsonProperty("type")
val deviceType: String
)

Puede insertar una instancia NetworkDevice como se muestra en el siguiente código:

val ntwkColl = database.getCollection<NetworkDevice>("network_devices")
val deviceId = ObjectId().toHexString()
val device = NetworkDevice(deviceId, "Enterprise Wi-fi", "router")
ntwkColl.insertOne(device)

El documento insertado en MongoDB se parece al siguiente:

{
"_id": {...},
"name": "Enterprise Wi-fi",
"type": "router"
}

Puede recuperar documentos como instancias NetworkDevice e imprimirlos como se muestra en el siguiente código:

val annotatedClassResult = ntwkColl.find().toList()
println(annotatedClassResult)
[NetworkDevice(deviceId=..., name=Enterprise Wi-fi, deviceType=router)]

El controlador admite de forma nativa la codificación y decodificación de clases de datos definidas recursivamente sin causar recursión en tiempo de ejecución. Esta compatibilidad se extiende a ciclos de múltiples tipos de clases de datos en las definiciones de tipo. El siguiente código proporciona un ejemplo de diseño de una clase de datos recursiva:

data class DataClassTree(
val content: String,
val left: DataClassTree?,
val right: DataClassTree?
)

Puede realizar operaciones de lectura y escritura en clases de datos definidas recursivamente de la misma manera que lo hace con otras clases de datos. El siguiente código muestra cómo ejecutar una operación de búsqueda en una colección de tipos DataClassTree:

val treeColl = database.getCollection<DataClassTree>("language_trees")
val treeFilter = Filters.eq("left.left.right.content", "high german")
val treeResult = treeColl.find(treeFilter).firstOrNull()
println(treeResult)
DataClassTree(content=indo-european,
left=DataClassTree(content=germanic, left=DataClassTree(...)),
right=DataClassTree(content=romance, ...))

Volver

Tipos de códecs

En esta página