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 del documento: 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 y antiguo Artículo de Wikipedia.

El ejemplo de esta guía demuestra cómo realizar las siguientes tareas:

  • Configure el controlador para serializar y deserializar POJOs

  • Realizar operaciones CRUD que utilicen datos modelados por POJO

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 PojoCodecProvider. En este ejemplo, usamos la configuración automatic(true) de 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() para recuperar una instancia 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 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. Configure la instancia MongoDatabase o MongoCollection para usar los códecs en CodecRegistry. Puede 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 usar el POJO Flower, puede realizar operaciones CRUD en los datos modelados por el POJO.

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

  • Insertar 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

De forma predeterminada,PojoCodecProvider omite los campos del POJO que tienen el null valor. Para obtener más información sobre cómo especificar este comportamiento, consulte la guía de personalización de POJO.

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

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

No, el PojoCodecProvider genera automáticamente un ObjectId.

Sí. Para un ejemplo de esto, vea nuestra implementación en Github.

Sí, mediante 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