Menu Docs
Página inicial do Docs
/ / /
Driver de sincronização Java
/ / /

Operações em massa

Nesta página

  • Visão geral
  • Gravação em massa de collections
  • Inserir operação
  • Operação de substituição
  • Operação de atualização
  • Excluir operação
  • Ordem de execução
  • Gravação em massa do cliente
  • Inserir exemplo
  • Exemplo de substituição
  • Opções de gravação em massa
  • Resumo
  • MongoCollection.bulkWrite()
  • MongoClient.bulkWrite()

Neste guia, você pode aprender como usar as operações em massa no driver Java .

Para executar uma única operação de criação, substituição, atualização ou exclusão, você pode usar o método correspondente. Por exemplo, para inserir um documento e substituir um documento, você pode usar os métodos insertOne() e replaceOne(). Ao usar esses métodos, seu cliente faz uma chamada ao banco de dados para cada operação.

Ao usar uma operação de gravação em massa, você pode executar várias operações de gravação em menos chamadas de banco de dados . Você pode realizar operações de gravação em massa nos seguintes níveis:

  • Collection: você pode usar o MongoCollection.bulkWrite() método para executar operações de escrita em massa em uma única collection. Nesse método, cada tipo de operação de gravação requer pelo menos uma chamada de banco de dados . Por exemplo, MongoCollection.bulkWrite() coloca várias operações de atualização em uma chamada, mas faz duas chamadas separadas para o banco de dados para uma operação de inserção e uma operação de substituição.

  • Cliente: se o seu aplicação se conectar ao MongoDB Server versão 8.0 ou posterior, você poderá usar o MongoClient.bulkWrite() método para executar operações de gravação em massa em várias collections e bancos de dados no mesmo cluster. Este método executa todas as operações de gravação em uma chamada de banco de dados .

As operações de gravação em massa contêm uma ou mais operações de gravação. Para executar uma operação de gravação em massa no nível da coleção, passe um List de WriteModel documentos para o método MongoCollection.bulkWrite(). Um WriteModel é um modelo que representa uma operação de gravação.

O método MongoCollection.bulkWrite() executa cada tipo de operação de gravação em uma chamada de banco de dados separada. Por exemplo, quando você passa DeleteOneModel, DeleteManyModel e ReplaceOneModel objetos para o método, ele executa duas chamadas: uma para as operações de exclusão e outra para a operação de substituição.

Observação

Quando o cliente divide as operações em chamadas de banco de dados separadas, ele pode reordenar as operações para obter maior eficiência se a operação de gravação em massa não for ordenada. Para saber mais sobre a ordem de execução da operação, consulte a seção Ordem de execução.

As seções a seguir mostram como criar e usar cada documento WriteModel. Os exemplos em cada seção utilizam os seguintes documentos na coleção people:

{ "_id": 1, "name": "Karen Sandoval", "age": 31 }
{ "_id": 2, "name": "William Chin", "age": 54 }
{ "_id": 8, "name": "Shayla Ray", "age": 20 }

Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

Para executar uma operação de inserção, crie um InsertOneModel especificando o documento que você deseja inserir. Para inserir vários documentos, você deve criar um InsertOneModel para cada documento que deseja inserir.

O exemplo abaixo cria um InsertOneModel para dois documentos descrevendo pessoas:

InsertOneModel<Document> juneDoc = new InsertOneModel<>(new Document("name", "June Carrie")
.append("age", 17));
InsertOneModel<Document> kevinDoc = new InsertOneModel<>(new Document("name", "Kevin Moss")
.append("age", 22));

Importante

Ao executar um bulkWrite(), o InsertOneModel não pode inserir um documento com um _id que já existe na coleção. Em vez disso, o método joga um MongoBulkWriteException.

O exemplo a seguir tenta inserir dois documentos em que o _id é 1 e 3:

try {
List<WriteModel<Document>> bulkOperations = new ArrayList<>();
// Creates instructions to insert documents
InsertOneModel<Document> doc1 = new InsertOneModel<>(new Document("_id", 1));
InsertOneModel<Document> doc3 = new InsertOneModel<>(new Document("_id", 3));
bulkOperations.add(doc1);
bulkOperations.add(doc3);
// Runs a bulk write operation for the specified insert WriteModels
collection.bulkWrite(bulkOperations);
// Prints a message if any exceptions occur during the bulk write operation
} catch (MongoBulkWriteException e){
System.out.println("A MongoBulkWriteException occurred with the following message: " + e.getMessage());
}

O seguinte mostra a saída do código anterior:

A MongoBulkWriteException occurred with the following message:
Bulk write operation error on server sample-shard-00-02.pw0q4.mongodb.net:27017.
Write errors: [BulkWriteError{index=0, code=11000, message='E11000 duplicate key
error collection: crudOps.bulkWrite index: _id_ dup key: { _id: 1 }', details={}}].

Para ver por que o documento com o _id de 3 não foi inserido, consulte a seção Ordem de Execução .

Para obter mais informações sobre os métodos e as classes mencionados nesta seção, consulte a documentação da API InsertOneModel.

Para executar uma operação de substituição, crie um ReplaceOneModel especificando um filtro de query para o documento que você deseja substituir pelo documento de substituição.

Importante

Ao executar uma bulkWrite(), o ReplaceOneModel não pode fazer alterações em um documento que viole restrições de índice exclusivas na coleção e o modelo não substitui um documento se não houver correspondências para o filtro de query.

O exemplo a seguir cria um ReplaceOneModel para substituir um documento onde o _id é 1 por um documento que contém um campo location adicionado:

ReplaceOneModel<Document> celineDoc = new ReplaceOneModel<>(
Filters.eq("_id", 1),
new Document("name", "Celine Stork")
.append("location", "San Diego, CA"));

Se vários documentos corresponderem ao filtro de query especificado na instância ReplaceOneModel, a operação substituirá o primeiro resultado. Você pode especificar uma classificação em uma instância do ReplaceOptions para aplicar um pedido aos documentos correspondentes antes que o driver execute a operação de substituição, conforme mostrado no código a seguir:

ReplaceOptions options = ReplaceOptions.sort(Sorts.ascending("_id"));

Para obter mais informações sobre os métodos e classes descritas nesta seção, consulte os seguintes recursos:

Para executar uma operação de atualização, crie um UpdateOneModel ou um UpdateManyModel especificando um filtro de query para documentos que você deseja atualizar com quais são as atualizações.

O UpdateOneModel atualiza o primeiro documento que corresponde ao seu filtro de query, e o UpdateManyModel atualiza todos os documentos que correspondem ao seu filtro de query.

Importante

Ao executar um bulkWrite(), o UpdateOneModel e o UpdateManyModel não podem fazer alterações em um documento que viole restrições de índice exclusivas na collection, e os modelos não atualizam nenhum documento se não houver correspondências com o filtro de query.

O exemplo a seguir cria um UpdateOneModel para atualizar o campo age em um documento onde o _id é 2:

UpdateOneModel<Document> updateDoc = new UpdateOneModel<>(
Filters.eq("_id", 2),
Updates.set("age", 31));

Se vários documentos corresponderem ao filtro de query especificado na instância UpdateOneModel, a operação atualizará o primeiro resultado. Você pode especificar uma classificação em uma instância do UpdateOptions para aplicar um pedido aos documentos correspondentes antes que o driver execute a operação de atualização, conforme mostrado no código a seguir:

UpdateOptions options = UpdateOptions.sort(Sorts.ascending("_id"));

Para obter mais informações sobre os métodos e classes descritas nesta seção, consulte os seguintes recursos:

Para executar uma operação de exclusão, crie um DeleteOneModel ou um DeleteManyModel especificando um filtro de query para documentos que você deseja excluir.

O DeleteOneModel exclui o primeiro documento que corresponde ao filtro de query e o DeleteManyModel exclui todos os documentos que correspondem ao filtro de query.

Importante

Ao executar um bulkWrite(), o DeleteOneModel e o DeleteManyModel não excluem nenhum documento se não houver correspondência com seu filtro de query.

O exemplo a seguir cria um DeleteOneModel para excluir um documento onde _id é 1:

DeleteOneModel<Document> deleteDoc = new DeleteOneModel<>(Filters.eq("_id", 1));

Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

O método bulkWrite() aceita um BulkWriteOptions opcional como segundo parâmetro para especificar se a execução das operações em massa é ordenada ou não.

Por padrão, o método bulkWrite() executa operações em massa em ordem. Isso significa que as operações em massa são executadas na ordem em que você as adicionou à lista até que ocorra um erro, se houver.

O exemplo a seguir executa estas operações em massa:

  • Uma operação que insere um documento com um valor name de "Zaynab Omar" e um valor age de 37

  • Uma operação que substitui o documento onde o _id está 1 por um novo documento que contém o campo location

  • Uma operação que atualiza o documento com um valor de name de "Zaynab Omar" e altera o name para "Zaynab Hassan"

  • Uma operação que exclui todos os documentos onde o valor de age é maior que 50

List<WriteModel<Document>> bulkOperations = new ArrayList<>();
// Creates instructions to insert a document
InsertOneModel<Document> insertDoc = new InsertOneModel<>(new Document("_id", 6)
.append("name", "Zaynab Omar")
.append("age", 37));
// Creates instructions to replace the first document matched by the query
ReplaceOneModel<Document> replaceDoc = new ReplaceOneModel<>(Filters.eq("_id", 1),
new Document("name", "Sandy Kane")
.append("location", "Helena, MT"));
// Creates instructions to update the first document matched by the query
UpdateOneModel<Document> updateDoc = new UpdateOneModel<>(Filters.eq("name", "Zaynab Omar"),
Updates.set("name", "Zaynab Hassan"));
// Creates instructions to delete all documents matched by the query
DeleteManyModel<Document> deleteDoc = new DeleteManyModel<>(Filters.gt("age", 50));
bulkOperations.add(insertDoc);
bulkOperations.add(replaceDoc);
bulkOperations.add(updateDoc);
bulkOperations.add(deleteDoc);
// Runs a bulk write operation for the specified the insert, replace, update, and delete WriteModels in order
collection.bulkWrite(bulkOperations);

Depois de executar este exemplo, sua collection conterá o seguinte documento:

{ "_id": 1, "name": "Sandy Kane", "location": "Helena, MT" }
{ "_id": 8, "name": "Shayla Ray", "age": 20 }
{ "_id": 6, "name": "Zaynab Hassan", "age": 37 }

Você também pode executar operações em massa em qualquer ordem, especificando "false" para o método order() em BulkWriteOptions. Isso significa que todas as operações de gravação são executadas independentemente de erros e, se ocorrerem erros, a operação em massa os relata no final.

Adicionar ao exemplo anterior, incluindo os seguintes, especifica as operações em massa a serem executadas em qualquer ordem:

BulkWriteOptions options = new BulkWriteOptions().ordered(false);
// Runs a bulk write operation for the specified insert, replace, update, and delete WriteModels in any order
collection.bulkWrite(bulkOperations, options);

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.

No exemplo anterior, se o método bulkWrite() decidiu realizar a operação de inserção após a operação de atualização, nada muda com a operação de atualização porque o documento não existe naquele momento. Em seguida, sua coleção contém os seguintes documentos:

{ "_id": 1, "name": "Sandy Kane", "location": "Helena, MT" }
{ "_id": 8, "name": "Shayla Ray", "age": 20 }
{ "_id": 6, "name": "Zaynab Omar", "age": 37 }

Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

Ao conectar a um sistema executando o MongoDB Server 8.0 ou posterior, você pode usar o método MongoClient.bulkWrite() para escrever em vários bancos de dados e collections no mesmo cluster. O método MongoClient.bulkWrite() executa todas as operações de gravação em uma única chamada.

O método MongoClient.bulkWrite() usa uma lista de instâncias do ClientNamespacedWriteModel para representar diferentes operações de gravação. Você pode construir instâncias da interface ClientNamespacedWriteModel utilizando métodos de instância. Por exemplo, uma instância de ClientNamespacedInsertOneModel representa uma operação para inserir um documento e você pode criar esse modelo usando o método ClientNamespacedWriteModel.insertOne().

Observação

Erros de gravação em massa

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

Os modelos e seus métodos de instância correspondentes são descritos na tabela abaixo.

Modelo
Método de instância
Descrição
Parâmetros

ClientNamespacedInsertOneModel

insertOne()

Cria um modelo para inserir um documento no namespace.

namespace: Banco de dados e coleção para escrever em

document: Documento a inserir

ClientNamespacedUpdateOneModel

updateOne()

Cria um modelo para atualizar o primeiro documento no namespace que corresponde a filter.

namespace: Banco de dados e coleção para escrever em

filter: Filtro que seleciona qual documento atualizar

update: Atualize para aplicar ao documento correspondente

updatePipeline: Atualize o pipeline para aplicar ao documento correspondente

options: (opcional) Opções a serem aplicadas ao atualizar o documento

Você deve passar um valor para o parâmetro update ou updatePipeline.

ClientNamespacedUpdateManyModel

updateMany()

Cria um modelo para atualizar todos os documentos no namespace que correspondem a filter.

namespace: Banco de dados e coleção para escrever em

filter: Filtro que seleciona quais documentos atualizar

update: Atualize para aplicar aos documentos correspondentes

updatePipeline: Atualize o pipeline para aplicar aos documentos correspondentes

options: (opcional) Opções a serem aplicadas ao atualizar documentos

Você deve passar um valor para o parâmetro update ou updatePipeline.

ClientNamespacedReplaceOneModel

replaceOne()

Cria um modelo para substituir o primeiro documento no namespace que corresponde a filter.

namespace: Banco de dados e coleção para escrever em

filter: Filtro que seleciona qual documento substituir

replacement: documento de substituição

options: (opcional) Opções a serem aplicadas ao substituir documentos

ClientNamespacedDeleteOneModel

deleteOne()

Cria um modelo para excluir o primeiro documento no namespace que corresponde a filter.

namespace: Banco de dados e coleção para escrever em

filter: Filtro que seleciona qual documento excluir

option: (opcional) Opções a serem aplicadas ao excluir o documento

ClientNamespacedDeleteManyModel

deleteMany()

Cria um modelo para excluir todos os documentos no namespace que correspondem a filter.

namespace: Banco de dados e coleção para escrever em

filter: Filtro que seleciona quais documentos excluir

option: (opcional) Opções a serem aplicadas ao excluir documentos

As seções seguintes fornecem exemplos de como utilizar o método do cliente bulkWrite().

Para saber mais sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

Este exemplo mostra como usar o método bulkWrite() para inserir dois documentos. Um documento é inserido na collection db.people, enquanto o outro documento é inserido na collection db.things. A instância MongoNamespace define os bancos de dados e as collections aos quais cada operação de gravação se aplica.

MongoNamespace peopleNamespace = new MongoNamespace("db", "people");
MongoNamespace thingsNamespace = new MongoNamespace("db", "things");
List<ClientNamespacedWriteModel> bulkOperations = new ArrayList<>();
bulkOperations.add(ClientNamespacedWriteModel
.insertOne(
peopleNamespace,
new Document("name", "Julia Smith")
)
);
bulkOperations.add(ClientNamespacedWriteModel
.insertOne(
thingsNamespace,
new Document("object", "washing machine")
)
);
ClientBulkWriteResult result = mongoClient.bulkWrite(bulkOperations);

O exemplo a seguir mostra como usar o método bulkWrite() para substituir documentos existentes nas coleções db.people e db.things.

MongoNamespace peopleNamespace = new MongoNamespace("db", "people");
MongoNamespace thingsNamespace = new MongoNamespace("db", "things");
List<ClientNamespacedWriteModel> bulkOperations = new ArrayList<>();
bulkOperations.add(ClientNamespacedWriteModel.replaceOne(
peopleNamespace,
Filters.eq("_id", 1),
new Document("name", "Frederic Hilbert")
)
);
bulkOperations.add(ClientNamespacedWriteModel.replaceOne(
thingsNamespace,
Filters.eq("_id", 1),
new Document("object", "potato")
)
);
ClientBulkWriteResult result = mongoClient.bulkWrite(bulkOperations);

Depois que esse exemplo for executado com êxito, o documento que tem um valor _id de 1 na coleção people é substituído por um novo documento. O documento na coleção things que tem um valor _id de 1 é substituído por um novo documento.

Você pode passar uma instância de ClientBulkWriteOptions para o método bulkWrite() para especificar opções ao executar operações de gravação em massa.

Por padrão, as operações individuais em uma operação em massa são executadas na ordem em que você as especifica até que ocorra um erro ou até que sejam executadas com êxito. No entanto, você pode passar false para o método ordered() na interface ClientBulkWriteOptions para executar operações de gravação de forma não ordenada. Ao usar a opção não ordenada, uma operação de produção de erro não impede a execução de outras operações de gravação na chamada para o método bulkWrite().

O código a seguir define o método ordered() em uma instância de ClientBulkWriteOptions e executa uma operação de gravação em massa para inserir vários documentos.

MongoNamespace namespace = new MongoNamespace("db", "people");
ClientBulkWriteOptions options = ClientBulkWriteOptions
.clientBulkWriteOptions()
.ordered(false);
List<ClientNamespacedWriteModel> bulkOperations = new ArrayList<>();
bulkOperations.add(
ClientNamespacedWriteModel.insertOne(
namespace,
new Document("_id", 1).append("name", "Rudra Suraj")
)
);
// Causes a duplicate key error
bulkOperations.add(
ClientNamespacedWriteModel.insertOne(
namespace,
new Document("_id", 1).append("name", "Mario Bianchi")
)
);
bulkOperations.add(
ClientNamespacedWriteModel.insertOne(
namespace,
new Document("name", "Wendy Zhang")
)
);
ClientBulkWriteResult result = mongoClient.bulkWrite(bulkOperations, options);

Embora a operação de gravação que insere um documento com uma chave duplicada resulte em um erro, as outras operações são executadas porque a operação de gravação não é ordenada.

Para saber mais sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

Para executar uma operação em massa, você cria e passa uma lista de instâncias do WriteModel para o método bulkWrite().

Existem 6 subtipos diferentes de WriteModel: InsertOneModel, ReplaceOneModel, UpdateOneModel, UpdateManyModel, DeleteOneModel e DeleteManyModel.

Há duas maneiras de executar o método bulkWrite():

  • Solicitado, que executa as operações em massa para que ocorra um erro, se houver

  • Não ordenado, que executa todas as operações em massa em qualquer ordem e relata erros no final, se houver

Para saber mais sobre o bulkWrite comando da coleção, consulte a referência do método db.collection.bulkWrite() no Manual do MongoDB Server .

Ao conectar a uma implementação executando o MongoDB Server versão 8.0 ou posterior, você pode usar o método MongoClient.bulkWrite() para executar operações em massa em vários bancos de dados e collections de uma só vez.

Para executar uma operação em massa do cliente , você cria uma lista de ClientNamespacedWriteModel instâncias para este método.

Há seis subtipos de ClientNamespacedWriteModel usados para representar operações de escrita. Para construir esses modelos de gravação, você pode usar os métodos ClientNamespacedWriteModel correspondentes insertOne(), updateOne(), updateMany(), replaceOne(), deleteOne() e deleteMany(). Esses métodos usam um objeto MongoNamespace que define em qual banco de dados e coleção escrever.

O método MongoClient.bulkWrite() também pode usar um objeto ClientBulkWriteOptions para especificar diferentes opções de como o comando é executado.

Para saber mais sobre o comando do cliente,bulkWrite consulte a referência do método bulkWrite() no Manual do MongoDB Server .

Voltar

Upsert