Formato de dados do documento: POJOs
Visão geral
Neste guia, você pode aprender como armazenar e recuperar dados modelados por objetos Java antigos, ou POJOs. POJOs são frequentemente usados para encapsulamento de dados, que é a prática de separar lógica de negócios da representação de dados.
Dica
Para saber mais sobre POJOs, veja o artigo Plain Old Java Object na Wikipedia.
O exemplo deste guia demonstra como executar as seguintes tarefas:
Configurar o driver para serializar e desserializar POJOs
Execute operações CRUD que usam dados modelados por POJOs
Exemplo de POJO
As seções deste guia usam a seguinte amostra de classe POJO, que descreve as características das 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; } public String toString() { return "\nFlower {\n\tid: " + id + "\n\tname: " + name + "\n\tcolors: " + colors + "\n\tisBlooming: " + isBlooming + "\n\theight: " + height + "\n}"; } }
Ao definir um POJO para armazenar e recuperar dados dentro do MongoDB, use as seguintes diretrizes:
A classe POJO não pode implementar interfaces ou estender classes de uma framework.
Inclua todos os campos para os quais você deseja armazenar e recuperar dados e verifique se eles não estão marcados como
static
outransient
.Se você incluir métodos getter ou setter públicos usando as convenções de nomenclatura JavaBean em seu POJO, o driver os chamará ao serializar ou desserializar dados. Se você omitir os métodos de getter ou setter para um campo de propriedade pública, o driver acessará ou atribuirá a eles diretamente.
Configurar o driver para POJOs
Para configurar o driver para usar POJOs, você deve especificar os seguintes componentes:
PojoCodecProvider
instância que tem codecs que definem como codificar e decodificar os dados entre o formato POJO e BSON. O fornecedor também especifica a quais classes ou pacotes POJO os codecs se aplicam.CodecRegistry
instância que contém os codecs e outras informações relacionadas.MongoDatabase
ouMongoCollection
instância configurada para usar oCodecRegistry
.MongoCollection
instância criada com a classe de documento POJO vinculada ao tipo genéricoTDocument
.
Execute as seguintes etapas para atender aos requisitos de configuração definidos na seção anterior:
Configure o
PojoCodecProvider
. Neste exemplo, usamos a configuraçãoautomatic(true)
dePojoCodecProvider.Builder
para aplicar os codecs a qualquer classe e suas propriedades.CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build(); Observação
Os fornecedores de codecs também contêm outros objetos, como instâncias
ClassModel
eConvention
, que definem melhor o comportamento da serialização. Para obter mais informações sobre fornecedores de codecs e personalização, consulte o guia sobre personalização do POJO.Adicione a instância
PojoCodecProvider
a umCodecRegistry
. OCodecRegistry
permite a você especificar um ou mais fornecedores de codec para codificar os dados POJO. Neste exemplo, chamamos os seguintes métodos:fromRegistries()
para combinar múltiplasCodecRegistry
instâncias em uma instânciagetDefaultCodecRegistry()
para recuperar uma instância doCodecRegistry
de uma lista de fornecedores de codecfromProviders()
para criar uma instânciaCodecRegistry
a partir doPojoCodecProvider
O seguinte código mostra como instanciar o
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)); Configure a instância do
MongoDatabase
ouMongoCollection
para utilize os codecs noCodecRegistry
. Você pode configurar um banco de dados ou collection para especificar os codecs.Neste exemplo, definimos o
CodecRegistry
em umMongoDatabase
chamadosample_pojos
usando o métodowithCodecRegistry()
:MongoClient mongoClient = MongoClients.create(uri); MongoDatabase database = mongoClient.getDatabase("sample_pojos").withCodecRegistry(pojoCodecRegistry); Passe sua classe POJO para sua chamada para
getCollection()
como o parâmetro de classe de documento e especifique-o como o argumento de tipo de sua instânciaMongoCollection
, conforme mostrado no código a seguir:MongoCollection<Flower> collection = database.getCollection("flowers", Flower.class);
Realizar operações CRUD
Depois de configurar a instância MongoCollection
para usar o Flower
POJO, você poderá executar operações CRUD nos dados modelados pelo POJO.
Este exemplo demonstra como realizar as seguintes operações usando o Flower
POJO:
Inserir instâncias de
Flower
na collectionflowers
Atualizar um documento na collection
Excluir um documento na collection
Encontrar e imprimir todos os documentos na collection
// 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);
O exemplo imprime a seguinte saída:
[ 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 }]
Observação
Por padrão, o PojoCodecProvider
omite campos em seu POJO que estão configurados para null
. Para obter mais informações sobre como especificar esse comportamento, consulte o guia de personalização POJO .
Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:
Resumo
Este guia descreve como converter dados entre o formato BSON e POJO executando as seguintes tarefas:
Crie uma instância
PojoCodecProvider
que contém codecs que definem como codificar e decodificar dados entre os campos BSON e POJO.Especifique o comportamento de conversão automática para o
PojoCodecProvider
aplicarCodecs
em qualquer classe e suas propriedades.Adicione o
PojoCodecProvider
a umCodecRegistry
e especifique o registro em uma instância de umMongoDatabase
ouMongoCollection
.Execute operações CRUD que usam a classe POJO de amostra.