Menu Docs
Página inicial do Docs
/ / /
Driver de fluxos reativos do Java

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 .

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 e Address do repositório de origem do driver no Github:

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.

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 um MongoDatabase:

    database = database.withCodecRegistry(pojoCodecRegistry);
  • Use uma CodecRegistry alternativa com um MongoCollection:

    collection = collection.withCodecRegistry(pojoCodecRegistry);

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);

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>());

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>());

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'}}

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.

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'}}

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<>());

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 objeto Document 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.

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<>());

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<>());

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<>());

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.

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<>());

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<>());

Voltar

Validar assinaturas de driver