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
/ /

Formato de datos de documentos: POJOs

En esta guía, puedes aprender a almacenar y recuperar datos modelados por objetos Java comunes (POJOs). Los POJO se suelen utilizar para la encapsulación de datos, que es la práctica de separar la lógica empresarial de la representación de datos.

Tip

Para obtener más información sobre los POJO, consulte el Objeto Java simple Artículo de Wikipedia.

El ejemplo en esta guía muestra cómo realizar las siguientes tareas:

  • Configure el controlador para serializar y deserializar POJOs

  • Realizar operaciones CRUD que utilicen datos modelados por POJOs

Las secciones de esta guía utilizan la siguiente clase POJO de muestra, que describe las características de las flores:

public class Flower {
private ObjectId id;
private String name;
private List<String> colors;
private Boolean isBlooming;
private Float height;
// public empty constructor needed for retrieving the POJO
public Flower() {
}
public Flower(String name, Boolean isBlooming, Float height, List<String> colors) {
this.name = name;
this.isBlooming = isBlooming;
this.height = height;
this.colors = colors;
}
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getIsBlooming() {
return isBlooming;
}
public void setIsBlooming(Boolean isBlooming) {
this.isBlooming = isBlooming;
}
public Float getHeight() {
return height;
}
public void setHeight(Float height) {
this.height = height;
}
public List<String> getColors() {
return colors;
}
public void setColors(List<String> colors) {
this.colors = colors;
}
@Override
public String toString() {
return "\nFlower {\n\tid: " + id + "\n\tname: " + name + "\n\tcolors: " + colors + "\n\tisBlooming: " + isBlooming + "\n\theight: " + height + "\n}";
}
}

Al definir un POJO para almacenar y recuperar datos dentro de MongoDB, utiliza las siguientes pautas:

  • La clase POJO no puede implementar interfaces ni extender clases de un framework.

  • Incluya todos los campos para los que desee almacenar y recuperar datos, y asegúrese de que no estén marcados como static o transient.

  • Si incluyes getter o setter públicos utilizando las convenciones de nomenclatura JavaBean en tu POJO, el controlador los llama al serializar o deserializar datos. Si omites los métodos getter o setter para un campo de propiedad pública, el controlador accede o los asigna directamente.

Para configurar el controlador para que utilice POJOs, debe especificar los siguientes componentes:

  • PojoCodecProvider instancia que tiene Codecs que definen cómo codificar y decodificar los datos entre el formato POJO y BSON. El proveedor también especifica a qué clases o paquetes POJO se aplican los codecs.

  • CodecRegistry instancia que contiene los códecs y otra información relacionada.

  • MongoDatabase o la instancia MongoCollection que esté configurada para usar el CodecRegistry.

  • MongoCollection instancia que se crea con la clase de documento POJO vinculada al tipo genérico TDocument.

Realizar los siguientes pasos para cumplir con los requisitos de configuración definidos en la sección anterior:

  1. Configure el PojoCodecProvider. En este ejemplo, usamos la configuración automatic(true) del PojoCodecProvider.Builder para aplicar los códecs a cualquier clase y sus propiedades.

    CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();

    Nota

    Los proveedores de códec también contienen otros objetos, como las instancias de ClassModel y Convention, que definen aún más el comportamiento de serialización. Para obtener más información sobre los proveedores de códecs y la personalización, consulta la guía sobre Personalización de POJO.

  2. Agrega la instancia de PojoCodecProvider a un CodecRegistry. El CodecRegistry te permite especificar uno o más proveedores de códecs para codificar los datos POJO. En este ejemplo, llamamos a los siguientes métodos:

    • fromRegistries() para combinar varias instancias de CodecRegistry en una sola instancia

    • getDefaultCodecRegistry() recuperar una instancia de CodecRegistry de una lista de proveedores de códecs

    • fromProviders() crear una instancia CodecRegistry desde el PojoCodecProvider

    El siguiente código muestra cómo instanciar el CodecRegistry:

    // Include the following static imports before your class definition
    import static com.mongodb.MongoClientSettings.getDefaultCodecRegistry;
    import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
    import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;
    ...
    CodecRegistry pojoCodecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(pojoCodecProvider));
  3. Configura la instancia MongoDatabase o MongoCollection para usar los códecs en el CodecRegistry. Puedes configurar una base de datos o una colección para especificar los códecs.

    En este ejemplo, configuramos el CodecRegistry en un MongoDatabase llamado sample_pojos mediante el método withCodecRegistry():

    MongoClient mongoClient = MongoClients.create(uri);
    MongoDatabase database = mongoClient.getDatabase("sample_pojos").withCodecRegistry(pojoCodecRegistry);
  4. Pasa tu clase POJO como parámetro de clase de documento en la llamada a getCollection() y especifícalo como el argumento de tipo de tu instancia MongoCollection, como se muestra en el siguiente código:

    MongoCollection<Flower> collection = database.getCollection("flowers", Flower.class);

Una vez que haya configurado la instancia MongoCollection para utilizar el POJO Flower, podrá realizar operaciones CRUD en los datos modelados por el POJO.

Este ejemplo demuestra cómo realizar las siguientes operaciones utilizando el Flower POJO:

  • Inserte instancias de Flower en la colección flowers

  • Actualiza un documento en la colección

  • Borrar un documento en la colección

  • Buscar e imprimir todos los documentos de la colección

// Insert three Flower instances
Flower roseFlower = new Flower("rose", false, 25.4f, Arrays.asList(new String[] {"red", "pink"}));
Flower daisyFlower = new Flower("daisy", true, 21.1f, Arrays.asList(new String[] {"purple", "white"}));
Flower peonyFlower = new Flower("peony", false, 19.2f, Arrays.asList(new String[] {"red", "green"}));
collection.insertMany(Arrays.asList(roseFlower, daisyFlower, peonyFlower));
// Update a document
collection.updateOne(
Filters.lte("height", 22),
Updates.addToSet("colors", "pink")
);
// Delete a document
collection.deleteOne(Filters.eq("name", "rose"));
// Return and print all documents in the collection
List<Flower> flowers = new ArrayList<>();
collection.find().into(flowers);
System.out.println(flowers);

El ejemplo imprime la siguiente salida:

[
Flower {
id: 65b178ffa38ac42044ca1573
name: daisy
colors: [purple, white, pink]
isBlooming: true
height: 21.1
},
Flower {
id: 65b178ffa38ac42044ca1574
name: peony
colors: [red, green]
isBlooming: false
height: 19.2
}]

Nota

Por defecto, el PojoCodecProvider omite los campos en su POJO que están configurados en null. Para más información sobre cómo especificar este comportamiento, consulta la guía Personalización de POJO.

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulta la siguiente documentación de la API:

Esta sección responde preguntas que pueden surgir al almacenar POJOs en MongoDB.

No, el PojoCodecProvider genera automáticamente un ObjectId.

Sí. Anota un campo que contiene múltiples valores con @BsonId para usarlo como clave compuesta. El siguiente ejemplo define una clase EntityKey con campos code y date, y luego la usa como el campo _id en un POJO Entity:

public static class EntityKey {
@BsonCreator
public EntityKey(@BsonProperty("code") String code,
@BsonProperty("date") Date date) {
this.code = code;
this.date = date;
}
// getters
}
public static class Entity {
@BsonId
private final EntityKey key;
@BsonCreator
public Entity(@BsonProperty("key") EntityKey key) {
this.key = key;
}
// getters and setters
}

Sí, usando un discriminador. Para más información, consulte la sección Discriminadores de la guía de Personalización de POJO.

No. El códec POJO nativo asume que los getters y setters tienen los mismos modificadores para cada campo.

Por ejemplo, los siguientes métodos lanzan una excepción durante la codificación:

private String getField();
public String setField(String x);

Esta excepción significa que debe registrar un códec para la clase ya que no existe ninguno.

Volver

Documentos