Operações em massa
Nesta página
Visão geral
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.
Execução de 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:
Inserir operação
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.
Exemplo
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.
Operação de substituição
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.
Exemplo
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:
Documentação da API do ReplaceOneModel
Índices exclusivos Explicação do manual do servidor
Operação de atualização
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.
Exemplo
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:
Documentação da API do UpdateOneModel
Documentação da API do UpdateManyModel
Explicação do manual do servidor de índices exclusivos
Excluir operação
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.
Exemplo
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:
Ordem de execução
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.
Execução ordenada
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.
Exemplo
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 valorage
de37
Uma operação que substitui o documento onde o
_id
está1
por um novo documento que contém o campolocation
Uma operação que atualiza o documento com um valor de
name
de"Zaynab Omar"
e altera oname
para"Zaynab Hassan"
Uma operação que exclui todos os documentos onde o valor de
age
é maior que50
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 }
Execução não ordenada
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:
Resumo
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