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

Operações de gravação em massa

Nesta página

  • Visão geral
  • Dados de amostra
  • Definir as operações de gravação
  • Inserir operações
  • Atualizar operações
  • Operações de substituição
  • Excluir operações
  • Ligue para o método bulkWrite()
  • Personalizar operações de gravação em massa
  • Informações adicionais
  • Documentação da API

Neste guia, você aprenderá a executar várias operações de gravação em uma única chamada de banco de dados de dados usando operações de gravação em massa.

Considere um cenário no qual você deseja inserir um documento em uma coleção, atualizar vários outros documentos e excluir um documento. Se você usar métodos individuais, cada operação exigirá sua própria chamada de banco de dados de dados. Este guia mostra como usar operações de gravação em massa para reduzir o número de chamadas para o banco de dados de dados.

Os exemplos neste guia usam a collection sample_restaurants.restaurants dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de amostra, consulte o tutorial Introdução .

Importante

Biblioteca do Reator do Projeto

Este guia usa a biblioteca Project Reactor para consumir instâncias do Publisher retornadas pelos métodos de driver Java Reactive Streams. Para saber mais sobre a biblioteca do Project Reactor e como usá-la, consulte Introdução na documentação do Reactor. Para saber mais sobre como usamos os métodos da biblioteca do Project Reactor neste guia, consulte o guia Gravar dados no MongoDB .

Para cada operação de gravação que você deseja executar, crie uma instância de uma das seguintes classes:

  • InsertOneModel

  • UpdateOneModel

  • UpdateManyModel

  • ReplaceOneModel

  • DeleteOneModel

  • DeleteManyModel

Em seguida, passe uma lista dessas instâncias para o método bulkWrite() .

As seções seguintes mostram como criar e utilizar instâncias das classes anteriores.

Para executar uma operação de inserção, crie uma instância de InsertOneModel e passe no documento que você deseja inserir.

O exemplo a seguir cria uma instância de InsertOneModel:

InsertOneModel<Document> operation = new InsertOneModel<>(
new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches"));

Para inserir vários documentos, crie uma instância de InsertOneModel para cada documento.

Para atualizar um documento, crie uma instância de UpdateOneModel e passe os seguintes argumentos:

  • Filtro de query que especifica os critérios usados para corresponder aos documentos em sua coleção.

  • Atualize a operação que você deseja executar. Para obter mais informações sobre operações de atualização, consulte o guia Operadores de atualização de campo no manual do MongoDB Server .

UpdateOneModel atualiza o primeiro documento que corresponde ao seu filtro de query.

O exemplo a seguir cria uma instância de UpdateOneModel:

UpdateOneModel<Document> operation = new UpdateOneModel<>(
eq("name", "Mongo's Deli"),
set("cuisine", "Sandwiches and Salads"));

Para atualizar vários documentos, crie uma instância de UpdateManyModel e passe os mesmos argumentos. UpdateManyModel atualiza todos os documentos que correspondem ao seu filtro de query.

O exemplo a seguir cria uma instância de UpdateManyModel:

UpdateManyModel<Document> operation = new UpdateManyModel<>(
eq("name", "Mongo's Deli"),
set("cuisine", "Sandwiches and Salads"));

Uma operação de substituição remove todos os campos e valores de um documento especificado, exceto o campo _id , e os substitui por novos. Para executar uma operação de substituição, crie uma instância de ReplaceOneModel e passe um filtro de query e os campos e valores que você deseja armazenar no documento correspondente.

O exemplo a seguir cria uma instância de ReplaceOneModel:

ReplaceOneModel<Document> operation = new ReplaceOneModel<>(
eq("name", "Original Pizza"),
new Document("name", "Mongo's Pizza")
.append("borough", "Manhattan"));

Para substituir vários documentos, crie uma instância de ReplaceOneModel para cada documento.

Para excluir um documento, crie uma instância do DeleteOneModel e passe um filtro de query especificando o documento que você deseja excluir. DeleteOneModel remove somente o primeiro documento que corresponde ao seu filtro de query.

O exemplo a seguir cria uma instância de DeleteOneModel:

DeleteOneModel<Document> operation = new DeleteOneModel<>(
eq("restaurant_id", "5678"));

Para excluir vários documentos, crie uma instância do DeleteManyModel e passe um filtro de query especificando os documentos que deseja excluir. DeleteManyModel remove todos os documentos que correspondem ao seu filtro de query.

O exemplo a seguir cria uma instância de DeleteManyModel:

DeleteManyModel<Document> operation = new DeleteManyModel<>(
eq("name", "Mongo's Deli"));

Depois de definir uma instância de classe para cada operação que deseja executar, passe uma lista dessas instâncias para o método bulkWrite() . Por padrão, o método executa as operações na ordem em que foram definidas na lista.

O exemplo a seguir executa diversas operações de gravação usando o método bulkWrite() :

Publisher<BulkWriteResult> bulkWritePublisher = restaurants.bulkWrite(
Arrays.asList(new InsertOneModel<>(
new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches")
.append("borough", "Manhattan")
.append("restaurant_id", "1234")),
new InsertOneModel<>(new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches")
.append("borough", "Brooklyn")
.append("restaurant_id", "5678")),
new UpdateManyModel<>(eq("name", "Mongo's Deli"),
set("cuisine", "Sandwiches and Salads")),
new DeleteOneModel<>(eq("restaurant_id", "1234"))));
BulkWriteResult bulkResult = Mono.from(bulkWritePublisher).block();
System.out.println(bulkResult.toString());
AcknowledgedBulkWriteResult{insertedCount=2, matchedCount=2, removedCount=1, modifiedCount=2, upserts=[], inserts=[BulkWriteInsert{index=0, id=BsonObjectId{value=66a7e0a6c08025218b657208}}, BulkWriteInsert{index=1, id=BsonObjectId{value=66a7e0a6c08025218b657209}}]}

Se qualquer uma das operações de gravação falhar, o driver Java Reactive Streams sinalizará um MongoBulkWriteException e não executará mais nenhuma operação individual. MongoBulkWriteException inclui um BulkWriteError que pode ser acessado usando o método MongoBulkWriteException.getWriteErrors() , que fornece detalhes da falha individual.

Observação

Quando o driver Java Reactive Streams executa uma operação em massa, ele usa o writeConcern da collection na qual a operação está sendo executada. O driver relata todos os erros de preocupação de gravação depois de tentar todas as operações, independentemente da ordem de execução.

A classe BulkWriteOptions contém métodos que modificam o comportamento do método bulkWrite() . Para usar a classe BulkWriteOptions , construa uma nova instância da classe e, em seguida, chame um ou mais de seus métodos para modificar a operação de gravação. Você pode encadear essas chamadas de método. Para modificar o comportamento da operação de gravação, passe a instância da classe como o último argumento para o método bulkWrite() .

Você pode utilizar os seguintes métodos na classe BulkWriteOptions para modificar um método de escrita. Todos os métodos são opcionais.

Método
Descrição
bypassDocumentValidation(Boolean bypassDocumentValidation)
Specifies whether the bulk write operation bypasses document validation. This lets you perform write operations on documents that don't meet the schema validation requirements, if any exist. For more information about schema validation, see Schema Validation in the MongoDB Server manual.
comment(Bson comment)
Attaches a Bson comment to the operation. For more information, see the insert command fields guide in the MongoDB Server manual.
comment(String comment)
Attaches a String comment to the operation. For more information, see the insert command fields guide in the MongoDB Server manual.
let(Bson variables)
Specifies a map of parameter names and values. Values must be constant or closed expressions that don't reference document fields. For more information, see the let statement in the MongoDB Server manual.
ordered(Boolean ordered)
If set to True, the driver performs the individual operations in the order provided. If an individual operation fails, the driver will not execute any subsequent individual operations.
Defaults to True.

O exemplo a seguir chama o método bulkWrite() do exemplo anterior, mas define a opção ordered como False:

Publisher<BulkWriteResult> bulkWritePublisher = restaurants.bulkWrite(
Arrays.asList(new InsertOneModel<>(
new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches")
.append("borough", "Manhattan")
.append("restaurant_id", "1234")),
new InsertOneModel<>(new Document("name", "Mongo's Deli")
.append("cuisine", "Sandwiches")
.append("borough", "Brooklyn")
.append("restaurant_id", "5678")),
new UpdateManyModel<>(eq("name", "Mongo's Deli"),
set("cuisine", "Sandwiches and Salads")),
new DeleteOneModel<>(eq("restaurant_id", "1234"))),
new BulkWriteOptions().ordered(false));
BulkWriteResult bulkResult = Mono.from(bulkWritePublisher).block();
System.out.println(bulkResult.toString());
AcknowledgedBulkWriteResult{insertedCount=2, matchedCount=2, removedCount=1, modifiedCount=2, upserts=[], inserts=[BulkWriteInsert{index=0, id=BsonObjectId{value=66a7e03cce430c5854b6caf9}}, BulkWriteInsert{index=1, id=BsonObjectId{value=66a7e03cce430c5854b6cafa}}]}

Se qualquer uma das operações de gravação em uma gravação em massa não ordenada falhar, o driver Java Reactive Streams relatará os erros somente depois de tentar todas as operações.

Observação

Operações em massa não ordenadas não garantem ordem de execução. A ordem pode ser diferente da forma como você os lista para otimizar o tempo de execução.

Para saber como realizar operações de escrita individuais, consulte os seguintes guias:

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Exclua documentos