Esta guía utiliza Plain Old Java Objects o POJOs para modelar documentos en lugar del modelo genérico Document clase.
Los ejemplos de código de esta guía provienen de la PojoQuickTour.java archivo en el repositorio de GitHub del código fuente del controlador.
Importante
Esta guía utiliza implementaciones personalizadas de Subscriber, que se describen en la Guíade implementación de suscriptores personalizados de muestra.
Requisitos previos
Debe configurar los siguientes componentes para ejecutar los ejemplos de código en esta guía:
Servidor MongoDB ejecutándose en el puerto predeterminado para MongoDB (
27017)Dependencia del controlador instalada en su proyecto
Las siguientes declaraciones de importación:
import com.mongodb.client.result.InsertOneResult; import com.mongodb.client.result.InsertManyResult; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.MongoDatabase; import org.bson.codecs.configuration.CodecRegistry; import org.bson.codecs.pojo.PojoCodecProvider; import java.util.List; import static com.mongodb.client.model.Filters.*; import static com.mongodb.client.model.Updates.*; import static java.util.Arrays.asList; import static org.bson.codecs.configuration.CodecRegistries.fromProviders; import static org.bson.codecs.configuration.CodecRegistries.fromRegistries; Definiciones de clases POJO. Copia el código completo de los POJO
PersonyAddressdesde el repositorio fuente del controlador en GitHub:
Creando un Registry de Codec personalizado
Antes de poder usar un POJO con el controlador, debe configurar el CodecRegistry para incluir un códec que gestione la traducción hacia y desde BSON para sus POJOs. La forma más sencilla de hacerlo es usar el método PojoCodecProvider.builder() para crear y configurar un CodecProvider.
El siguiente ejemplo combina el registro de códec predeterminado con el PojoCodecProvider configurado para crear automáticamente instancias POJO Codec:
CodecRegistry pojoCodecRegistry = fromRegistries( MongoClientSettings.getDefaultCodecRegistry(), fromProviders(PojoCodecProvider.builder().automatic(true).build()) );
Nota
Los registros se verifican en orden hasta que uno devuelve un códec para la clase solicitada. El DefaultCodecRegistry debe ser el primero en la lista, y el PojoCodecProvider debe ser siempre el último CodecProvider ya que puede proporcionar un códec para casi cualquier clase.
Utilizando el CodecRegistry
La siguiente lista describe formas de configurar el pojoCodecRegistry para su uso:
Establécelo al instanciar un objeto
MongoClient:MongoClientSettings settings = MongoClientSettings.builder() .codecRegistry(pojoCodecRegistry) .build(); MongoClient mongoClient = MongoClients.create(settings); Utilice una alternativa
CodecRegistrycon unMongoDatabase:database = database.withCodecRegistry(pojoCodecRegistry); Utilice una alternativa
CodecRegistrycon unMongoCollection:collection = collection.withCodecRegistry(pojoCodecRegistry);
Insertar un POJO en MongoDB
El registro de codecs intenta automáticamente crear un POJO Codec para clases desconocidas. Esto te permite utilizar POJOs lista para usar sin ninguna configuración extra.
Antes de poder insertar un POJO en MongoDB, crea una instancia de MongoCollection configurada con la clase POJO:
MongoCollection<Person> collection = database.getCollection("people", Person.class);
Insertar una instancia de persona
Para insertar un Person en la colección, utilice el método insertOne() de la colección:
Person ada = new Person("Ada Byron", 20, new Address("St James Square", "London", "W1")); collection.insertOne(ada).subscribe(new OperationSubscriber<InsertOneResult>());
Insertar varias instancias de persona
Para insertar múltiples instancias de Person, puedes utilizar el método insertMany() de la colección, que toma una lista de instancias de Person como parámetro.
El siguiente ejemplo agregará varias instancias de Person a la colección:
List<Person> people = asList( new Person("Charles Babbage", 45, new Address("5 Devonshire Street", "London", "W11")), new Person("Alan Turing", 28, new Address("Bletchley Hall", "Bletchley Park", "MK12")), new Person("Timothy Berners-Lee", 61, new Address("Colehill", "Wimborne", null)) ); collection.insertMany(people).subscribe(new OperationSubscriber<InsertManyResult>());
Consulta de la colección
Para query la colección, puedes utilizar el método find().
El siguiente ejemplo muestra todas las instancias de Person en la colección:
collection.find().subscribe(new PrintToStringSubscriber<>());
Person{id='...', name='Ada Byron', age=20, address=Address{street='St James Square', city='London', zip='W1'}} Person{id='...', name='Charles Babbage', age=45, address=Address{street='5 Devonshire Street', city='London', zip='W11'}} Person{id='...', name='Alan Turing', age=28, address=Address{street='Bletchley Hall', city='Bletchley Park', zip='MK12'}} Person{id='...', name='Timothy Berners-Lee', age=61, address=Address{street='Colehill', city='Wimborne', zip='null'}}
Especificar un filtro de consulta
Para query para instancias de Person que cumplan con ciertas condiciones, pasa un objeto de filtro al método find(). Para facilitar la creación de objetos de filtro, el driver proporciona métodos asistentes Filters.
Importante
Al hacer query a POJO, debes hacer query contra el nombre del campo del documento y no contra el nombre de la propiedad de POJO. Por defecto son iguales, pero es posible cambiar cómo se asignan los nombres de las propiedades POJO.
Obtener una única persona que coincida con un filtro
El siguiente ejemplo encuentra el primer Person en la base de datos que tiene un valor de address.city igual a Wimborne pasando un objeto de filtro eq() para especificar la condición de igualdad:
collection.find(eq("address.city", "Wimborne")) .first() .subscribe(new PrintToStringSubscriber<>());
Person{id='591dbc2550852fa685b3ad1a', name='Timothy Berners-Lee', age=61, address=Address{street='Colehill', city='Wimborne', zip='null'}}
Obtén todas las instancias de Persona que coincidan con un filtro
El siguiente ejemplo imprime cada documento en el que el valor de age es mayor que 30:
collection.find(gt("age", 30)).subscribe(new PrintToStringSubscriber<>());
Update Documents
Para actualizar documentos en una colección, puede utilizar los métodos updateOne() y updateMany() de la colección.
Pasa los siguientes parámetros a los métodos:
El objeto de filtro para determinar el documento o los documentos que se actualizarán. Para especificar un filtro vacío y hacer coincidir todas las instancias de
Person, utiliza un objetoDocumentvacío.Documento de actualización que especifica las modificaciones. Para ver una lista de los operadores disponibles, consulte "Operadores de actualización" en el manual del servidor.
Los métodos de actualización devuelven un tipo UpdateResult que proporciona información sobre la operación, incluido el número de documentos modificados por la actualización.
Actualizar una sola persona
Para actualizar un único Person, utiliza el método updateOne().
El siguiente ejemplo actualiza un Person llamado "Ada Byron" estableciendo su edad en 23 y su nombre en "Ada Lovelace":
collection.updateOne( eq("name", "Ada Byron"), combine(set("age", 23), set("name", "Ada Lovelace")) ).subscribe(new OperationSubscriber<>());
Actualización de múltiples instancias de personas
Para actualizar todas las instancias de Person que coincidan con un filtro, usa el método updateMany().
El siguiente ejemplo establece el campo zip en null para todos los documentos que tienen un valor de zip:
collection.updateMany(not(eq("zip", null)), set("zip", null)) .subscribe(new OperationSubscriber<>());
Sustituir a una sola persona
Otra forma de cambiar una instancia existente de Person es mediante el método replaceOne().
El siguiente ejemplo reemplaza un Person llamado "Ada Lovelace" con la instancia Person referenciada por la variable ada en el ejemplo insertOne anterior:
collection.replaceOne(eq("name", "Ada Lovelace"), ada) .subscribe(new OperationSubscriber<>());
Delete Documents
Para borrar documentos de una colección, puedes usar los métodos deleteOne() y deleteMany() de la colección.
Pase un objeto filtro para hacer coincidir el o los documentos que desea borrar. Para especificar un filtro vacío, utiliza un objeto vacío Document.
Los métodos de eliminación devuelven un tipo DeleteResult que proporciona información sobre la operación, incluido el número de documentos eliminados.
Borrar una sola Persona que coincide con un Filtro
Para borrar una sola Person que coincida con un filtro, utiliza el método deleteOne().
El siguiente ejemplo elimina un Person que tiene un valor address.city de Wimborne:
collection.deleteOne(eq("address.city", "Wimborne")) .subscribe(new OperationSubscriber<>());
Borrar todas las instancias de personas que coincidan con un filtro
Para eliminar varias instancias de Person que coincidan con un filtro, utiliza el método deleteMany().
El siguiente ejemplo elimina todas las instancias Person que tienen un valor de address.city igual a London:
collection.deleteMany(eq("address.city", "London")) .subscribe(new OperationSubscriber<>());