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 arquivo PojoquickTour.java no repositório do Github de 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
PersoneAddressdo 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
CodecRegistryalternativa com umMongoDatabase:database = database.withCodecRegistry(pojoCodecRegistry); Use uma
CodecRegistryalternativa 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 objetoDocumentvazio.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<>());