Exemplos de operação de POJO CRUD
Nesta página
- Pré-requisitos
- Criando um codecRegistry personalizado
- Uso do CodecRegistry
- Inserindo um POJO no MongoDB
- Inserir uma instância de pessoa
- Inserir instâncias de várias pessoas
- Consulte a coleção
- Especificar um filtro de query
- Obtenha uma única pessoa que corresponda a um filtro
- Obtenha todas as instâncias de pessoa que correspondem a um filtro
- Atualize documentos
- Atualizar uma única pessoa
- Atualizar instâncias de várias pessoas
- Substituir uma única pessoa
- Exclua documentos
- Excluir uma única pessoa que corresponda a um filtro
- Excluir todas as instâncias de pessoa que correspondem a um filtro
Este guia usa objetos Java antigos simples, ou POJOs, para modelar documentos em vez da classe Document
genérica.
Os exemplos de código neste guia vêm do PojoquickTour.java no repositório do Github do código fonte do driver.
Importante
Este guia usa implementações personalizadas de Subscriber
, que são descritas no guia Amostra de implementações personalizadas de assinantes .
Pré-requisitos
Você deve configurar os seguintes componentes para executar os exemplos de código neste guia:
Servidor MongoDB em execução na porta padrão para o MongoDB (
27017
)Dependência do driver instalada em seu projeto
As seguintes declarações de importação:
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; Definições da classe POJO. Copie o código completo para os POJOs
Person
eAddress
do repositório de origem do driver no Github:
Criando um codecRegistry personalizado
Antes de poder usar um POJO com o driver, você precisa configurar o CodecRegistry
para incluir um codec que lide com a tradução de e para BSON para seus POJOs. A maneira mais simples de fazer isso é usar o método PojoCodecProvider.builder()
para criar e configurar um CodecProvider
.
O exemplo seguinte combina o registro de codec padrão com o PojoCodecProvider
configurado para criar automaticamente instâncias POJO Codec
:
CodecRegistry pojoCodecRegistry = fromRegistries( MongoClientSettings.getDefaultCodecRegistry(), fromProviders(PojoCodecProvider.builder().automatic(true).build()) );
Observação
Os registros são verificados em ordem até que um retorne um codec para a classe solicitada. O DefaultCodecRegistry
deve ser o primeiro na lista e o PojoCodecProvider
deve ser sempre o último CodecProvider
, pois ele pode fornecer um codec para quase qualquer classe.
Uso do CodecRegistry
A seguinte lista descreve maneiras de configurar o pojoCodecRegistry
para uso:
Defina ao instanciar um objeto
MongoClient
:MongoClientSettings settings = MongoClientSettings.builder() .codecRegistry(pojoCodecRegistry) .build(); MongoClient mongoClient = MongoClients.create(settings); Use uma
CodecRegistry
alternativa com umMongoDatabase
:database = database.withCodecRegistry(pojoCodecRegistry); Use uma
CodecRegistry
alternativa com umMongoCollection
:collection = collection.withCodecRegistry(pojoCodecRegistry);
Inserindo um POJO no MongoDB
O registro do codec tenta criar automaticamente um POJO Codec
para classes desconhecidas. Isso permite que você use POJOs prontos para uso sem nenhuma configuração extra.
Antes de inserir um POJO no MongoDB, crie uma instância MongoCollection
configurada com a classe POJO:
MongoCollection<Person> collection = database.getCollection("people", Person.class);
Inserir uma instância de pessoa
Para inserir um Person
na coleção, use o método insertOne()
da coleção:
Person ada = new Person("Ada Byron", 20, new Address("St James Square", "London", "W1")); collection.insertOne(ada).subscribe(new OperationSubscriber<InsertOneResult>());
Inserir instâncias de várias pessoas
Para inserir múltiplas instâncias do Person
, você pode utilizar o método da coleção insertMany()
, que utiliza uma lista de instâncias do Person
como um parâmetro.
O exemplo a seguir adicionará várias instâncias Person
à coleção:
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>());
Consulte a coleção
Para fazer query da coleção, você pode usar o método find()
.
O exemplo a seguir imprime todas as instâncias Person
na coleção:
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'}}
Especificar um filtro de query
Para executar query de instâncias Person
que correspondam a determinadas condições, passe um objeto de filtro para o método find()
. Para facilitar a criação de objetos de filtro, o driver fornece métodos auxiliares Filters
.
Importante
Ao executar query de POJOs, você deve consultar o nome do campo do documento e não o nome da propriedade POJO. Eles são os mesmos por padrão, mas é possível alterar a forma como os nomes das propriedade POJO são mapeados.
Obtenha uma única pessoa que corresponda a um filtro
O exemplo a seguir localiza o primeiro Person
no banco de dados que tem um valor address.city
de Wimborne
passando um objeto de filtro eq()
para especificar a condição de igualdade:
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'}}
Obtenha todas as instâncias de pessoa que correspondem a um filtro
O exemplo a seguir imprime todos os documento em que o valor de age
é maior que 30
:
collection.find(gt("age", 30)).subscribe(new PrintToStringSubscriber<>());
Atualize documentos
Para atualizar documentos em uma collection, você pode usar os métodos updateOne()
e updateMany()
da collection.
Passe os seguintes parâmetros para os métodos:
Filtre objeto para determinar o documento ou documentos a serem atualizados. Para especificar um filtro vazio e corresponder a todas as instâncias
Person
, use um objetoDocument
vazio.Atualizar documento que especifica as modificações. Para exibir uma lista dos operadores disponíveis, consulte Operadores de atualização no manual do servidor MongoDB.
Os métodos de atualização retornam um tipo de UpdateResult
que fornece informações sobre a operação, incluindo o número de documentos modificados pela atualização.
Atualizar uma única pessoa
Para atualizar um único Person
, use o método updateOne()
.
O exemplo a seguir atualiza um Person
denominado "Ada Byron"
definindo sua idade como 23
e nome como "Ada Lovelace"
:
collection.updateOne( eq("name", "Ada Byron"), combine(set("age", 23), set("name", "Ada Lovelace")) ).subscribe(new OperationSubscriber<>());
Atualizar instâncias de várias pessoas
Para atualizar todas as instâncias do Person
que correspondem a um filtro, utilize o método updateMany()
.
O exemplo a seguir define o campo zip
como null
para todos os documentos que têm um valor zip
:
collection.updateMany(not(eq("zip", null)), set("zip", null)) .subscribe(new OperationSubscriber<>());
Substituir uma única pessoa
Outra maneira de alterar uma instância do Person
existente é utilizar o método replaceOne()
.
O exemplo seguinte substitui um Person
denominado "Ada Lovelace"
pela instância Person
referenciada pela variável ada
no exemplo insertOne anterior:
collection.replaceOne(eq("name", "Ada Lovelace"), ada) .subscribe(new OperationSubscriber<>());
Exclua documentos
Para excluir documentos de uma collection, você pode usar os métodos deleteOne()
e deleteMany()
da collection.
Passe um objeto de filtro para corresponder ao documento ou documentos a serem excluídos. Para especificar um filtro vazio, use um objeto Document
vazio.
Os métodos de exclusão retornam um tipo de DeleteResult
que fornece informações sobre a operação, incluindo o número de documentos excluídos.
Excluir uma única pessoa que corresponda a um filtro
Para excluir um único Person
que corresponda a um filtro, use o método deleteOne()
.
O exemplo a seguir exclui um Person
que tem um valor address.city
de Wimborne
:
collection.deleteOne(eq("address.city", "Wimborne")) .subscribe(new OperationSubscriber<>());
Excluir todas as instâncias de pessoa que correspondem a um filtro
Para excluir múltiplas instâncias do Person
que correspondem a um filtro, utilize o método deleteMany()
.
O exemplo a seguir exclui todas as instâncias Person
que têm um valor address.city
de London
:
collection.deleteMany(eq("address.city", "London")) .subscribe(new OperationSubscriber<>());