Overview
En esta guía, aprenderá a almacenar y recuperar datos en el controlador Java de MongoDB mediante registros Java. Estos registros son un tipo de clase Java que se utiliza a menudo para modelar datos y separar la lógica de negocio de su representación.
Tip
Puede declarar registros Java en Java 16 o posterior. Obtenga más información sobre la funcionalidad y las restricciones de los registros en Actualizaciones del lenguaje Java 17: clases de registro.
Si utiliza una versión anterior de Java, puede usar objetos Java comunes. Consulte la Formato de datos del documento: Guía de POJO para detalles de implementación.
Nota
Si está utilizando el controlador en un contenedor OSGi y su aplicación utiliza el controlador para codificar o decodificar registros Java, debe agregar una dependencia explícita en el org.bson.codecs.record Módulo. Obtenga más información sobre la definición de dependencias para contenedores OSGi en la documentación de IBM OSGi.
Serializar y deserializar un registro
El controlador admite de forma nativa la codificación y decodificación de registros Java para operaciones de lectura y escritura en MongoDB mediante el registro de códecs predeterminado. Este registro es un conjunto de clases llamadas códecs que definen cómo convertir, codificar y decodificar tipos Java. Obtenga más información sobre los códecs y el registro de códecs predeterminado en la guía sobre codificación de datos con códecs de tipo.
Ejemplo de registro
Los ejemplos de código de esta sección hacen referencia al siguiente registro de muestra, que describe un dispositivo de almacenamiento de datos:
public record DataStorageRecord( String productName, double capacity ) {}
Insertar un registro
Puede insertar una instancia DataStorageRecord como se muestra en el siguiente código:
MongoCollection<DataStorageRecord> collection = database.getCollection("data_storage_devices", DataStorageRecord.class); // insert the record collection.insertOne(new DataStorageRecord("2TB SSD", 1.71));
Recuperar un registro
Puede recuperar documentos como instancias DataStorageRecord e imprimirlos como se muestra en el siguiente código:
MongoCollection<DataStorageRecord> collection = database.getCollection("data_storage_devices", DataStorageRecord.class); // retrieve and print the records List<DataStorageRecord> records = new ArrayList<DataStorageRecord>(); collection.find().into(records); records.forEach(System.out::println);
DataStorageRecord[productName=1TB SSD, capacity=1.71]
Especificar la conversión de componentes mediante anotaciones
Esta sección describe cómo configurar el comportamiento de serialización de los componentes de registros utilizando anotaciones. Para obtener una lista completa de anotaciones compatibles, consulte la documentación API del paquete org.bson.codecs.pojo.annotations.
Nota
El controlador admite anotaciones para registros Java, pero solo si se incluyen al definir el componente, como se muestra en el siguiente registro de ejemplo. No se pueden usar anotaciones dentro del constructor del registro.
Ejemplo de registro anotado
Los ejemplos de código de esta sección hacen referencia al siguiente registro de muestra, que describe un dispositivo de red:
import org.bson.BsonType; import org.bson.codecs.pojo.annotations.BsonProperty; import org.bson.codecs.pojo.annotations.BsonId; import org.bson.codecs.pojo.annotations.BsonRepresentation; public record NetworkDeviceRecord( @BsonId() String deviceId, String name, String deviceType ) {}
Insertar un registro anotado
Puede insertar una instancia DataStorageRecord como se muestra en el siguiente código:
MongoCollection<NetworkDeviceRecord> collection = database.getCollection("network_devices", NetworkDeviceRecord.class); // insert the record String deviceId = new ObjectId().toHexString(); collection.insertOne(new NetworkDeviceRecord(deviceId, "Enterprise Wi-fi", "router"));
El documento insertado en MongoDB se parece al siguiente:
{ _id: ObjectId("fedc..."), name: 'Enterprise Wi-fi', type: 'router' }
Recuperar un registro anotado
Puede recuperar documentos como instancias NetworkDeviceRecord e imprimirlos como se muestra en el siguiente código:
MongoCollection<NetworkDeviceRecord> collection = database.getCollection("network_devices", NetworkDeviceRecord.class); // return all documents in the collection as records List<NetworkDeviceRecord> records = new ArrayList<NetworkDeviceRecord>(); collection.find().into(records); records.forEach(System.out::println);
NetworkDeviceRecord[deviceId=fedc..., name=Enterprise Wi-fi, deviceType=router]
Nota
El org.bson.codecs.records.annotations paquete está obsoleto. Utilice las anotaciones equivalentes del paquete org.bson.codecs.pojo.annotations.
Operaciones con tipos recursivos
El controlador admite de forma nativa la codificación y decodificación de registros definidos recursivamente sin causar recursión en tiempo de ejecución. Esta compatibilidad se extiende a ciclos de múltiples tipos de registro en las definiciones de tipo. El siguiente código proporciona un ejemplo de diseño de registro recursivo:
public record RecordTree( String content, RecordTree left, RecordTree right ) {}
Puede realizar operaciones de lectura y escritura en registros definidos recursivamente de la misma manera que lo haría con otros registros. El siguiente código muestra cómo ejecutar una operación de búsqueda en una colección de tipos RecordTree:
MongoDatabase database = mongoClient.getDatabase("myDB"); MongoCollection<RecordTree> collection = database.getCollection("myCollection", RecordTree.class); Bson filter = Filters.eq("left.left.right.content", "Ikatere"); collection.find(filter).forEach(doc -> System.out.println(doc));
RecordTree[content=Ranginui, left=RecordTree[content=..., left=RecordTree[content=..., right=RecordTree[content=Ikatere...]]
Recuperar el códec de registro
Puedes usar el RecordCodecProvider para recuperar el códec de registros. Debes usar esta interfaz cuando quieras personalizar el código para codificar y decodificar objetos de registro Java hacia y desde sus BSON types correspondientes, al mismo tiempo que minimizas la duplicación de código. Para obtener más información sobre los códecs y su uso, consulta Códecs.
No se puede crear un códec de registro directamente, pero se puede usar RecordCodecProvider para implementarlo en el código. Para obtener más información RecordCodecProvider sobre, consulte la documentación de la API.