Operações em massa
Nesta página
Visão geral
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 .
Gravação em massa de collections
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:
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"));
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:
Documentação da API doReplaceOneModel
Documentaçãoda API ReplaceOptions
Í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));
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:
UpdateOneModel API documentation
Documentação da API doUpdateManyModel
UpdateOptions API documentation
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:
Gravação em massa do cliente
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 |
---|---|---|---|
|
| Cria um modelo para inserir um documento no |
|
|
| Cria um modelo para atualizar o primeiro documento no |
Você deve passar um valor para o parâmetro |
|
| Cria um modelo para atualizar todos os documentos no |
Você deve passar um valor para o parâmetro |
|
| Cria um modelo para substituir o primeiro documento no |
|
|
| Cria um modelo para excluir o primeiro documento no |
|
|
| Cria um modelo para excluir todos os documentos no |
|
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:
Inserir exemplo
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);
Exemplo de substituição
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.
Opções de gravação em massa
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.
Exemplo de ordem de execução
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:
Resumo
MongoCollection.bulkWrite()
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 .
MongoClient.bulkWrite()
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 .