Overview
En esta guía, puedes aprender cómo almacenar y recuperar datos en el controlador MongoDB Kotlin utilizando clases de datos de Kotlin.
Serializar y deserializar una clase de datos
El driver admite de forma nativa la codificación y decodificación de clases de datos de Kotlin para operaciones de lectura y escritura en MongoDB utilizando el registro de códecs por defecto. El registro de códecs por defecto es una colección de clases llamadas códecs que definen cómo codificar y decodificar tipos de Kotlin y Java.
Clase de datos de ejemplo
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)
Insertar una clase de datos
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)
Recuperar una clase de datos
Puede recuperar documentos como instancias DataStorage e imprimirlos como se muestra en el siguiente código:
val collection = database.getCollection<DataStorage>("data_storage_devices") // Retrieve and print the documents as data classes val resultsFlow = collection.find() resultsFlow.collect { println(it) }
DataStorage(productName=tape, capacity=5.0)
Tip
Métodos de construcción y propiedades de la clase de datos
Puedes utilizar los métodos de las clases builder directamente con las propiedades de la data class añadiendo la dependencia opcional de extensiones del driver de Kotlin a tu aplicación. Para aprender más y ver ejemplos, consulta la Guía deuso de constructores con clases de datos.
Se especifica una clase para los documentos devueltos de una colección, incluso si es diferente de la clase especificada 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 NewDataStorage. La operación añade el campo releaseDate al documento con un valor name de tape:
// Define a data class for returned documents data class NewDataStorage( 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 as the type parameter in withDocumentClass() val result = collection .withDocumentClass<NewDataStorage>() .findOneAndUpdate(filter, update, options) println("Updated document: $result")
Updated document: NewDataStorage(productName=tape, capacity=5.0, releaseDate=2023-06-15)
Para obtener más información sobre esta funcionalidad, consulta Especificar tipo de retorno en la guía de Bases de datos y Colecciones.
Especifique la conversión de componentes utilizando anotaciones
Esta sección describe las anotaciones que se pueden utilizar para configurar el comportamiento de serialización de las clases de datos y proporciona un ejemplo para demostrar el comportamiento de anotación.
Puedes utilizar las siguientes anotaciones en clases de datos:
Nombre de la anotación | Descripción |
|---|---|
| Marca una propiedad para serializar como la propiedad |
| Especifica un nombre de campo de documento personalizado al convertir el campo de clase de datos a BSON. |
| Especifica el tipo BSON que MongoDB usa para almacenar el valor. Utiliza esta anotación solo cuando necesites almacenar un valor como un tipo BSON diferente del de la propiedad de la clase de datos. ADVERTENCIA: Tu código podría lanzar una excepción si incluyes la anotación |
Para obtener información de referencia sobre estas anotaciones de la propiedad, consulte la org.bson.codecs.pojo.annotations paquete.
Ejemplo de clase de datos anotada
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( val deviceId: String, val name: String, val deviceType: String )
Inserta una clase de datos anotada
Puedes insertar una instancia de NetworkDevice como se muestra en el siguiente código:
val collection = database.getCollection<NetworkDevice>("network_devices") // Insert the record val deviceId = ObjectId().toHexString() val device = NetworkDevice(deviceId, "Enterprise Wi-fi", "router") collection.insertOne(device)
El documento insertado en MongoDB debe parecerse al siguiente:
{ _id: ObjectId("fedc..."), name: 'Enterprise Wi-fi', type: 'router' }
Recuperar una clase de datos anotados
Puede recuperar documentos como instancias NetworkDevice e imprimirlos como se muestra en el siguiente código:
val collection = database.getCollection<NetworkDevice>("network_devices") // Return all documents in the collection as data classes val resultsFlow = collection.find() resultsFlow.collect { println(it) }
NetworkDevice(deviceId=645cf..., name=Enterprise Wi-fi, deviceType=router)
Operaciones con tipos recursivos
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? )
Puedes realizar operaciones de lectura y guardar en clases de datos definidas de manera recursiva de la misma forma que lo harías en otras clases de datos. El siguiente código muestra cómo puedes ejecutar una operación de búsqueda en una colección de tipos DataClassTree:
val collection = database.getCollection<DataClassTree>("myCollection") val filter = Filters.eq("left.left.right.content", "high german") val resultsFlow = collection.find(filter) resultsFlow.collect { println(it) }
DataClassTree(content=indo-european, left=DataClassTree(content=germanic, left=DataClassTree(content=german, left=null, right=DataClassTree(content=high german, ...)), right=...)