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ía Muestra de implementaciones personalizadas de suscriptor.
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 por defecto de MongoDB (
27017)Dependencia de controlador instalada en su proyecto
Las siguientes instrucciones 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ódecs por defecto con la PojoCodecProvider configurada para crear automáticamente instancias de 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); Utiliza un
CodecRegistryalternativo con unMongoDatabase:database = database.withCodecRegistry(pojoCodecRegistry); Utiliza un
CodecRegistryalternativo con 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, usa 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 query
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, puedes usar 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.Actualice el documento que especifica las modificaciones. Para ver una lista de los operadores disponibles, consulta Operadores de actualizar 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<>());