Esta guía utiliza objetos Java simples o POJO para modelar documentos en lugar de los objetos genéricos. Document clase.
Los ejemplos de código en esta guía provienen de ArchivoPojoQuickTour.java en el repositorio de GitHub del código fuente del controlador.
Importante
Esta guía utiliza implementaciones Subscriber personalizadas, 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 de 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 clase POJO. Copie el código completo de los POJO
PersonyAddressdel repositorio de código 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 revisan en orden hasta que uno de ellos devuelve un códec para la clase solicitada. El DefaultCodecRegistry debe ser el primero de la lista y el PojoCodecProvider 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 pojoCodecRegistry para su uso:
Configúrelo al crear una instancia de 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 del códec intenta crear automáticamente un POJO Codec para clases desconocidas. Esto permite usar POJOs de forma predeterminada sin necesidad de configuración adicional.
Antes de poder insertar un POJO en MongoDB, cree una instancia 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á múltiples instancias 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 consultar la colección, puede utilizar el método find().
El siguiente ejemplo imprime todas las instancias 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 consultar instancias Person que cumplan ciertas condiciones, pase un objeto de filtro al método find(). Para facilitar la creación de objetos de filtro, el controlador proporciona métodos auxiliares Filters.
Importante
Al consultar POJOs,debe consultar el nombre del campo del documento y no el nombre de la propiedad del POJO. Son los mismos por defecto, pero es posible cambiar la forma en que se asignan los nombres de las propiedades del POJO.
Consigue una sola 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'}}
Obtener todas las instancias de persona que coinciden con un filtro
El siguiente ejemplo imprime todos los documentos en los que el valor de age sea 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.
Pase 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 solo Person, utilice 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<>());
Actualizar instancias de varias personas
Para actualizar todas las Person instancias que coinciden con un filtro, utilice el método updateMany().
El siguiente ejemplo establece el campo zip en null para todos los documentos que tienen un valor zip:
collection.updateMany(not(eq("zip", null)), set("zip", null)) .subscribe(new OperationSubscriber<>());
Reemplazar a una sola persona
Otra forma de cambiar una instancia Person existente es utilizar el método replaceOne().
El siguiente ejemplo reemplaza un Person llamado "Ada Lovelace" con la instancia a la Person que hace referencia la ada variable en el ejemplo insertOne anterior:
collection.replaceOne(eq("name", "Ada Lovelace"), ada) .subscribe(new OperationSubscriber<>());
Delete Documents
Para eliminar documentos de una colección, puede utilizar los métodos deleteOne() y deleteMany() de la colección.
Pase un objeto de filtro que coincida con el documento o los documentos que se eliminarán. Para especificar un filtro vacío, utilice un objeto Document vacío.
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.
Eliminar una sola persona que coincida con un filtro
Para eliminar un solo Person que coincida con un filtro, utilice 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<>());
Eliminar todas las instancias de persona que coinciden con un filtro
Para eliminar varias instancias Person que coincidan con un filtro, utilice el método deleteMany().
El siguiente ejemplo elimina todas las Person instancias que tienen un valor address.city de London:
collection.deleteMany(eq("address.city", "London")) .subscribe(new OperationSubscriber<>());