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

Operações em massa

Nesta página

  • Visão geral
  • Execução de operações em massa
  • Inserir operação
  • Operação de substituição
  • Operação de atualização
  • Excluir operação
  • Ordem de execução
  • Execução ordenada
  • Execução não ordenada
  • Resumo

Neste guia, você pode aprender como usar operações em massa no Driver Java do MongoDB.

Para executar uma operação de criação, substituição, atualização ou exclusão, use seu método correspondente. Por exemplo, para inserir um documento, atualizar vários documentos e excluir um documento em sua coleção, use os métodos insertOne(), updateMany() e deleteOne().

O MongoClient executa estas operações fazendo uma chamada para cada operação para o banco de dados. Você pode reduzir o número de chamadas para o banco de dados usando operações em massa.

As operações em massa consistem em um grande número de operações de escrita. Para executar uma operação em massa, passe um List de WriteModel documentos para o método bulkWrite(). Um WriteModel é um modelo que representa qualquer uma das operações de gravaçã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:

  • bulkWrite()

  • WriteModel

  • BulkWriteOptions

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

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

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:

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

Existem 6 documentos WriteModel diferentes: 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

Voltar

Upsert