Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Ejemplos de operaciones CRUD con POJO

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.

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 Person y Address desde el repositorio 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 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.

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

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

    collection = collection.withCodecRegistry(pojoCodecRegistry);

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

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

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

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.

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 cada documento en el que el valor de age es 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.

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

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

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

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.

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

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

Volver

Validar firmas de drivers