Docs Menu
Docs Home
/ /

Ejemplos de operaciones CRUD con POJO

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.

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 Person y Address del repositorio de código fuente del controlador en GitHub:

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.

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 CodecRegistry con un MongoDatabase:

    database = database.withCodecRegistry(pojoCodecRegistry);
  • Utilice una alternativa CodecRegistry con un MongoCollection:

    collection = collection.withCodecRegistry(pojoCodecRegistry);

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);

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>());

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>());

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'}}

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.

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'}}

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<>());

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 objeto Document vací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.

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<>());

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<>());

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<>());

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.

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<>());

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<>());

Volver

Validar las firmas de los conductores