Visão geral
Neste guia, você pode aprender a usar o driver Node.js para executar operações em massa. Operações em massa ajudam a reduzir o número de chamadas para o servidor. Em vez de enviar uma solicitação para cada operação, você pode realizar várias operações em uma ação.
Dica
Para saber mais sobre operações em massa, consulte Operações de gravação em massa no manual do MongoDB Server.
Você pode usar operações em massa para executar várias operações de gravação em uma coleção. Você também pode executar operações em massa a partir do cliente, o que permite realizar gravações em massa em vários namespaces. No MongoDB, um namespace consiste no nome do banco de dados e o nome da coleção no formato <database>.<collection>.
Observação
Não há limite para a quantidade de operações de gravação que um driver pode lidar. Os drivers agrupam dados em lotes de acordo com o maxWriteBatchSize, que é 100,000 e não pode ser modificado. Se o lote contiver mais de 100,000 operações, o driver dividirá o lote em grupos menores com contagens menores ou iguais ao maxWriteBatchSize. Por exemplo, se a operação contiver operações 250,000, o driver criará três lotes: dois com 100,000 operações e um com 50,000 operações.
Este guia inclui as seguintes seções:
Operações de inserção em massa descreve como realizar operações de inserção em massa em sua collection ou cliente.
Operações de substituição em massa descreve como executar operações de substituição em massa em sua collection ou cliente.
Bulk Update Operations descreve como executar operações de atualização em massa em sua collection ou cliente.
Operações de exclusão em massa descreve como executar operações de exclusão em massa em sua collection ou cliente.
Tratamento de exceções descreve as exceções que ocorrem se qualquer uma das operações de gravação em massa falhar.
Informações adicionais fornecem links para recursos e documentação de API para os tipos e métodos mencionados neste guia.
Importante
Requisitos de versão do servidor e do driver
As operações de gravação em massa em nível de collection exigem as seguintes versões:
MongoDB Server versão 3.2 ou posterior
Versão do driver Node.js 3.6 ou posterior
As operações de gravação em massa no nível do cliente exigem as seguintes versões:
MongoDB Server versão 8.0 ou posterior
Versão do driver Node.js 6.10 ou posterior
Dados de amostra
Os exemplos neste guia utilizam as coleções movies e users no banco de dados do sample_mflix, que está incluído nos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia MongoDB Get Started.
Operações de inserção em massa
Para executar uma operação de inserção em massa, crie um modelo de operação em massa para cada documento que você deseja inserir. Em seguida, passe uma lista desses modelos para o método bulkWrite().
Esta seção descreve como executar os seguintes tipos de operações em massa:
Inserções em massa de collections
Para executar uma operação de inserção em massa na sua collection, crie um InsertOneModel para cada operação. Em seguida, chame o método bulkWrite() em sua coleção e passe uma array de modelos como parâmetro. Para criar um InsertOneModel, especifique o campo document do modelo e defina-o para o documento que você deseja inserir.
Exemplo
Este exemplo executa as seguintes ações:
Especifica duas instâncias do
InsertOneModelem uma array. CadaInsertOneModelrepresenta um documento para inserir na coleçãomoviesno banco de dadossample_mflix.Chama o método
bulkWrite()na coleçãomoviese passa uma array de modelos como parâmetro.Imprime o número de documentos inseridos.
const insertModels = [{ insertOne: { document: { title: "The Favourite", year: 2018, rated: "R", released: "2018-12-21" } } }, { insertOne: { document: { title: "I, Tonya", year: 2017, rated: "R", released: "2017-12-08" } } }]; const insertResult = await movies.bulkWrite(insertModels); console.log(`Inserted documents: ${insertResult.insertedCount}`);
Inserted documents: 2
Inserções em massa do cliente
Para executar uma operação de inserção em massa em múltiplas coleções ou bancos de dados, crie um ClientBulkWriteModel para cada operação. Em seguida, chame o método bulkWrite() em seu cliente e passe uma array de modelos como parâmetro.
A tabela seguinte descreve os campos que você pode configurar em um ClientBulkWriteModel para especificar uma operação de inserção:
Campo | Descrição |
|---|---|
| O namespace no qual inserir um documento. |
| A operação que você deseja executar. Para operações de inserção, configure este campo |
| O documento a inserir. |
Exemplo
Este exemplo executa as seguintes ações:
Especifica três instâncias do
ClientBulkWriteModelem uma array. Os dois primeiros modelos representam documentos a inserir na collectionmovies, e o último modelo representa um documento a ser inserido na collectionusers.Chama o método
bulkWrite()em um cliente e passa uma array de modelos como um parâmetro.Imprime o número de documentos inseridos.
const clientInserts = [{ namespace: "sample_mflix.movies", name: "insertOne", document: { title: "The Favourite", year: 2018, rated: "R", released: "2018-12-21" } }, { namespace: "sample_mflix.movies", name: "insertOne", document: { title: "I, Tonya", year: 2017, rated: "R", released: "2017-12-08" } }, { namespace: "sample_mflix.users", name: "insertOne", document: { name: "Brian Schwartz", email: "bschwartz@example.com" } }]; const clientInsertRes = await client.bulkWrite(clientInserts); console.log(`Inserted documents: ${clientInsertRes.insertedCount}`);
Inserted documents: 3
Operações de substituição em massa
Para executar uma operação de substituição em massa, crie um modelo de operação em massa para cada documento que deseja substituir. Em seguida, passe uma lista desses modelos para o método bulkWrite().
Esta seção descreve como executar os seguintes tipos de operações em massa:
Coleções de substituições em massa
Para executar uma operação de substituição em massa na sua collection, crie um ReplaceOneModel para cada operação. Em seguida, chame o método bulkWrite() em sua coleção e passe uma array de modelos como parâmetro.
A tabela a seguir descreve os campos que você pode definir em um ReplaceOneModel:
Campo | Descrição |
|---|---|
| O filtro que corresponde ao documento que você deseja substituir. |
| O documento de substituição . |
| (Opcional) O agrupamento a ser usado ao classificar os resultados. Para saber mais sobre agrupamentos, consulte a seção Agrupamento do guia Configurar operações CRUD. |
| (Opcional) O índice a ser usado para a operação. Para saber mais sobre índices, consulte o guia Índices para otimização de queries. |
| (Opcional) Se um novo documento será criado se nenhum documento corresponder ao filtro. |
Exemplo
Este exemplo executa as seguintes ações:
Especifica duas instâncias do
ReplaceOneModelem uma array. As instânciasReplaceOneModelcontêm instruções para substituir documentos que representam filmes na coleçãomovies.Chama o método
bulkWrite()na coleçãomoviese passa uma array de modelos como parâmetro.Imprime o número de documentos modificados.
const replaceOperations = [{ replaceOne: { filter: { title: "The Dark Knight" }, replacement: { title: "The Dark Knight Rises", year: 2012, rating: "PG-13" }, upsert: false } }, { replaceOne: { filter: { title: "Inception" }, replacement: { title: "Inception Reloaded", year: 2010, rating: "PG-13" }, upsert: false } }]; const replaceResult = await movies.bulkWrite(replaceOperations); console.log(`Modified documents: ${replaceResult.modifiedCount}`);
Modified documents: 2
Substituições em massa do cliente
Para executar uma operação de substituição em massa em múltiplas coleções ou bancos de dados, crie um ClientBulkWriteModel para cada operação. Em seguida, chame o método bulkWrite() em seu cliente e passe uma array de modelos como parâmetro.
A tabela seguinte descreve os campos que você pode configurar em um ClientBulkWriteModel para especificar uma operação de substituição:
Campo | Descrição |
|---|---|
| O namespace no qual substituir um documento. |
| A operação que você deseja executar. Para operações de substituição, defina este campo |
| O filtro que corresponde ao documento que você deseja substituir. |
| O documento de substituição . |
| (Opcional) O agrupamento a ser usado ao classificar os resultados. Para saber mais sobre agrupamentos, consulte a seção Agrupamento do guia Configurar operações CRUD. |
| (Opcional) O índice a ser usado para a operação. Para saber mais sobre índices, consulte o guia Índices para otimização de queries. |
Exemplo
Este exemplo executa as seguintes ações:
Especifica três instâncias do
ClientBulkWriteModelem uma array. Os dois primeiros modelos contêm instruções de substituição para documentos na collectionmoviese o último modelo contém instruções de substituição para um documento na collectionusers.Chama o método
bulkWrite()em um cliente e passa uma array de modelos como um parâmetro.Imprime o número de documentos modificados.
const clientReplacements = [{ namespace: "sample_mflix.movies", name: "replaceOne", filter: { title: "The Dark Knight" }, replacement: { title: "The Dark Knight Rises", year: 2012, rating: "PG-13" } }, { namespace: "sample_mflix.movies", name: "replaceOne", filter: { title: "Inception" }, replacement: { title: "Inception Reloaded", year: 2010, rating: "PG-13" } }, { namespace: "sample_mflix.users", name: "replaceOne", filter: { name: "April Cole" }, replacement: { name: "April Franklin", email: "aprilfrank@example.com" } }]; const clientReplaceRes = await client.bulkWrite(clientReplacements); console.log(`Modified documents: ${clientReplaceRes.modifiedCount}`);
Modified documents: 3
Operações de atualização em massa
Para executar uma operação de atualização em massa, crie um modelo de operação em massa para cada atualização que você deseja fazer. Em seguida, passe uma lista desses modelos para o método bulkWrite().
Esta seção descreve como executar os seguintes tipos de operações em massa:
Atualizações em massa de coleções
Para executar uma operação de atualização em massa na sua collection, crie um UpdateOneModel ou UpdateManyModel para cada operação. Em seguida, chame o método bulkWrite() em sua collection e passe uma array de modelos como parâmetro. Um UpdateOneModel atualiza somente um documento que corresponde a um filtro, enquanto um UpdateManyModel atualiza todos os documentos que correspondem a um filtro.
A tabela a seguir descreve os campos que você pode definir em um UpdateOneModel ou UpdateManyModel:
Campo | Descrição |
|---|---|
| O filtro que corresponde a um ou mais documentos que você deseja atualizar. Quando especificado em |
| A atualização a ser executada. |
| (Opcional) Um conjunto de filtros que especificam a quais elementos de array uma atualização se aplica se você estiver atualizando um campo com valor de array. |
| (Opcional) O agrupamento a ser usado ao classificar os resultados. Para saber mais sobre agrupamentos, consulte a seção Agrupamento do guia Configurar operações CRUD. |
| (Opcional) O índice a ser usado para a operação. Para saber mais sobre índices, consulte o guia Índices para otimização de queries. |
| (Opcional) Se um novo documento será criado se nenhum documento corresponder ao filtro. Por padrão, este campo é configurado |
Exemplo
Este exemplo executa as seguintes ações:
Especifica uma instância
UpdateOneModele uma instânciaUpdateManyModelem uma array. Esses modelos contêm instruções para atualizar documentos que representam filmes na coleçãomovies.Chama o método
bulkWrite()na coleçãomoviese passa uma array de modelos como parâmetro.Imprime o número de documentos modificados.
const updateOperations = [{ updateOne: { filter: { title: "Interstellar" }, update: { $set: { title: "Interstellar Updated", genre: "Sci-Fi Adventure" } }, upsert: true } }, { updateMany: { filter: { rated: "PG-13" }, update: { $set: { rated: "PG-13 Updated", genre: "Updated Genre" } } } }]; const updateResult = await movies.bulkWrite(updateOperations); console.log(`Modified documents: ${updateResult.modifiedCount}`);
Modified documents: 2320
Atualizações em massa do cliente
Para executar uma operação de atualização em massa em múltiplas coleções ou bancos de dados, crie um ClientBulkWriteModel para cada operação. Em seguida, chame o método bulkWrite() em seu cliente e passe uma array de modelos como parâmetro.
A tabela seguinte descreve os campos que você pode configurar em um ClientBulkWriteModel para especificar uma operação de atualização:
Campo | Descrição |
|---|---|
| O namespace no qual atualizar um documento. |
| A operação que você deseja executar. Para operações de atualização, configure este campo |
| O filtro que corresponde a um ou mais documentos que você deseja atualizar. Se você definir o modelo |
| As atualizações a serem executadas. |
| (Opcional) Um conjunto de filtros que especificam a quais elementos de array uma atualização se aplica se você estiver atualizando um campo com valor de array. |
| (Opcional) O agrupamento a ser usado ao classificar os resultados. Para saber mais sobre agrupamentos, consulte a seção Agrupamento do guia Configurar operações CRUD. |
| (Opcional) O índice a ser usado para a operação. Para saber mais sobre índices, consulte o guia Índices para otimização de queries. |
| (Opcional) Se um novo documento será criado se nenhum documento corresponder ao filtro. Por padrão, este campo é configurado |
Exemplo
Este exemplo executa as seguintes ações:
Especifica duas instâncias do
ClientBulkWriteModelem uma array. O primeiro modelo especifica uma operação de atualização muitos na coleçãomoviese o segundo modelo especifica uma operação de atualização um na coleçãousers.Chama o método
bulkWrite()em um cliente e passa uma array de modelos como um parâmetro.Imprime o número de documentos modificados.
const clientUpdates = [{ namespace: "sample_mflix.movies", name: "updateMany", filter: { rated: "PG-13" }, update: { $set: { rated: "PG-13 Updated", genre: "Updated Genre" } }, upsert: false }, { namespace: "sample_mflix.users", name: "updateOne", filter: { name: "Jon Snow" }, update: { $set: { name: "Aegon Targaryen", email: "targaryen@example.com" } }, upsert: false }]; const clientUpdateRes = await client.bulkWrite(clientUpdates); console.log(`Modified documents: ${clientUpdateRes.modifiedCount}`);
Modified documents: 2320
Operações de exclusão em massa
Para executar uma operação de exclusão em massa, crie um modelo de operação em massa para cada operação de exclusão. Em seguida, passe uma lista desses modelos para o método bulkWrite().
Esta seção descreve como executar os seguintes tipos de operações em massa:
Exclusões em massa de collections
Para executar uma operação de exclusão em massa em sua collection, crie um DeleteOneModel ou DeleteManyModel para cada operação. Em seguida, chame o método bulkWrite() em sua collection e passe uma array de modelos como parâmetro. Um DeleteOneModel exclui apenas um documento que corresponde a um filtro, enquanto um DeleteManyModel exclui todos os documentos que correspondem a um filtro.
A tabela a seguir descreve os campos que você pode definir em DeleteOneModel ou DeleteManyModel:
Campo | Descrição |
|---|---|
| O filtro que corresponde a um ou mais documentos que você deseja excluir. Quando especificado em |
| (Opcional) O agrupamento a ser usado ao classificar os resultados. Para saber mais sobre agrupamentos, consulte a seção Agrupamento do guia Configurar operações CRUD. |
| (Opcional) O índice a ser usado para a operação. Para saber mais sobre índices, consulte o guia Índices para otimização de queries. |
Exemplo
Este exemplo executa as seguintes ações:
Especifica uma instância
DeleteOneModele uma instânciaDeleteManyModelem uma array. Esses modelos contêm instruções para excluir documentos na coleçãomovies.Chama o método
bulkWrite()na coleçãomoviese passa uma array de modelos como parâmetro.Imprime o número de documentos excluídos.
const deleteOperations = [{ deleteOne: { filter: { title: "Dunkirk" } } }, { deleteMany: { filter: { rated: "R" } } }]; const deleteResult = await movies.bulkWrite(deleteOperations); console.log(`Deleted documents: ${deleteResult.deletedCount}`);
Deleted documents: 5538
Exclusões em massa de clientes
Para executar uma operação de exclusão em massa em várias coleções ou bancos de dados, crie um ClientBulkWriteModel para cada operação. Em seguida, chame o método bulkWrite() em seu cliente e passe uma array de modelos como parâmetro.
A tabela seguinte descreve os campos que você pode configurar em um ClientBulkWriteModel para especificar uma operação de exclusão:
Campo | Descrição |
|---|---|
| O namespace no qual excluir um documento. |
| A operação que você deseja executar. Para operações de exclusão, defina este campo |
| O filtro que corresponde a um ou mais documentos que você deseja excluir. Se você definir o modelo |
| (Opcional) O índice a ser usado para a operação. Para saber mais sobre índices, consulte o guia Índices para otimização de queries. |
| (Opcional) O agrupamento a ser usado ao classificar os resultados. Para saber mais sobre agrupamentos, consulte a seção Agrupamento do guia Configurar operações CRUD. |
Exemplo
Este exemplo executa as seguintes ações:
Especifica duas instâncias do
ClientBulkWriteModelem uma array. O primeiro modelo especifica uma operação para excluir muitos na collectionmoviese o segundo modelo especifica uma operação para excluir um na collectionusers.Chama o método
bulkWrite()em um cliente e passa uma array de modelos como um parâmetro.Imprime o número de documentos modificados.
const clientDeletes = [{ namespace: "sample_mflix.movies", name: "deleteMany", filter: { rated: "R" } }, { namespace: "sample_mflix.users", name: "deleteOne", filter: { email: "emilia_clarke@gameofthron.es" } }]; const clientDeleteRes = await client.bulkWrite(clientDeletes); console.log(`Deleted documents: ${clientDeleteRes.deletedCount}`);
Deleted documents: 5538
Tipo de devolução
BulkWriteResult
O método Collection.bulkWrite() retorna um objeto BulkWriteResult, que fornece informações sobre sua operação em massa.
As tabelas a seguir descrevem os campos de um objeto BulkWriteResult :
Campo | Descrição |
|---|---|
| O número de documentos inseridos |
| O número de documentos correspondentes |
| O número de documentos atualizados |
| O número de documentos atualizados |
| O número de documentos excluídos |
ClientBulkWriteResult
O método MongoClient.bulkWrite() retorna um objeto ClientBulkWriteResult , que inclui informações sobre a operação de gravação em massa do cliente .
As tabelas a seguir descrevem os campos de um objeto ClientBulkWriteResult :
Campo | Descrição |
|---|---|
| Um valor booleano indicando se a escrita em massa foi reconhecida |
| O número de documentos inseridos |
| O número de documentos correspondentes |
| O número de documentos atualizados |
| O número de documentos atualizados |
| O número de documentos excluídos |
| Os resultados de cada operação de inserção individual bem-sucedida |
| Os resultados de cada operação de atualização bem-sucedida individual |
| Os resultados de cada operação individual de exclusão bem-sucedida |
Tratamento de exceções
Exceções de gravação em massa da collection
Se alguma operação de gravação em massa chamada em uma collection não for bem-sucedida, o driver Node.js lançará um MongoBulkWriteError e não executará mais nenhuma operação se a opção ordered estiver definida como true. Se ordered estiver definido como false, ele tentará continuar com as operações subsequentes.
Dica
Para saber mais sobre operações em massa ordenadas e não ordenadas, consulte a seção Operações ordenadas versus não ordenadas no guia de escrita em massa do manual do MongoDB Server.
Um objeto MongoBulkWriteError contém as seguintes propriedades:
Propriedade | Descrição |
|---|---|
| A mensagem de erro. |
| Uma array de erros que ocorreram durante a operação de escrita em massa. |
| Erros de write concern que ocorreram durante a execução da operação de escrita em massa. |
| Os resultados de quaisquer operações bem-sucedidas realizadas antes de a exceção ser lançada. |
| O objeto de erro subjacente , que pode conter mais detalhes. |
Exceções de gravação em massa do cliente
Se alguma operação de gravação em massa chamada em seu cliente não tiver êxito, o driver do Node.js gerará um MongoClientBulkWriteError. Por padrão, o driver não executa nenhuma operação subsequente após encontrar um erro. Se você passar a opção ordered para o método bulkWrite() e defini-la como false, o driver continuará tentando as operações restantes.
Um objeto MongoClientBulkWriteError contém as seguintes propriedades:
Propriedade | Descrição |
|---|---|
| Um array de documentos especificando cada erro de preocupação de gravação . |
| Um mapa de erros que ocorreram durante operações de escrita individuais. |
| O resultado parcial da gravação em massa do cliente que reflete o progresso da operação antes do erro. |
bulkWrite() Exemplo: arquivo completo
Observação
Exemplo de configuração
Esse exemplo se conecta a uma instância do MongoDB usando um URI de conexão. Para saber mais sobre como se conectar à sua instância do MongoDB, consulte o guia Conectar ao MongoDB. Este exemplo também utiliza a coleção do movies no banco de dados do sample_mflix incluído nos conjuntos de dados de amostra do Atlas. Você pode carregá-los em seu banco de dados na camada grátis do MongoDB Atlas seguindo a Introdução ao MongoDB.
O código a seguir é um arquivo completo e autônomo que executa uma operação de gravação em massa na coleção theaters do banco de dados sample_mflix . O parâmetro operations inclui exemplos de operações de gravação insertOne, updateMany e deleteOne:
1 // Bulk write operation 2 3 // Import MongoClient from the MongoDB node driver package 4 const { MongoClient } = require("mongodb"); 5 6 // Replace the uri string with your MongoDB deployment's connection string 7 const uri = "<connection string uri>"; 8 9 const client = new MongoClient(uri); 10 11 async function run() { 12 try { 13 const database = client.db("sample_mflix"); 14 const theaters = database.collection("theaters"); 15 16 // Insert a new document into the "theaters" collection 17 const result = await theaters.bulkWrite([ 18 { 19 insertOne: { 20 document: { 21 location: { 22 address: { 23 street1: "3 Main St.", 24 city: "Anchorage", 25 state: "AK", 26 zipcode: "99501", 27 }, 28 }, 29 }, 30 }, 31 }, 32 { 33 insertOne: { 34 document: { 35 location: { 36 address: { 37 street1: "75 Penn Plaza", 38 city: "New York", 39 state: "NY", 40 zipcode: "10001", 41 }, 42 }, 43 }, 44 }, 45 }, 46 { 47 // Update documents that match the specified filter 48 updateMany: { 49 filter: { "location.address.zipcode": "44011" }, 50 update: { $set: { is_in_ohio: true } }, 51 upsert: true, 52 }, 53 }, 54 { 55 // Delete a document that matches the specified filter 56 deleteOne: { filter: { "location.address.street1": "221b Baker St" } }, 57 }, 58 ]); 59 // Log the result of the bulk write operation 60 console.log(result); 61 } finally { 62 // Close the database connection when the operations are completed or if an error occurs 63 await client.close(); 64 } 65 } 66 run().catch(console.dir);
1 import { MongoClient } from "mongodb"; 2 3 // Replace the uri string with your MongoDB deployment's connection string. 4 const uri = "<connection string uri>"; 5 6 const client = new MongoClient(uri); 7 8 interface Address { 9 street1: string; 10 city: string; 11 state: string; 12 zipcode: string; 13 } 14 15 interface Theater { 16 location: { address: Address }; 17 is_in_ohio?: boolean; 18 } 19 20 async function run() { 21 try { 22 const database = client.db("sample_mflix"); 23 const theaters = database.collection<Theater>("theaters"); 24 25 const result = await theaters.bulkWrite([ 26 { 27 insertOne: { 28 document: { 29 location: { 30 address: { 31 street1: "3 Main St.", 32 city: "Anchorage", 33 state: "AK", 34 zipcode: "99501", 35 }, 36 }, 37 }, 38 }, 39 }, 40 { 41 insertOne: { 42 document: { 43 location: { 44 address: { 45 street1: "75 Penn Plaza", 46 city: "New York", 47 state: "NY", 48 zipcode: "10001", 49 }, 50 }, 51 }, 52 }, 53 }, 54 { 55 updateMany: { 56 // Important: You lose type safety when you use dot notation in queries 57 filter: { "location.address.zipcode": "44011" }, 58 update: { $set: { is_in_ohio: true } }, 59 upsert: true, 60 }, 61 }, 62 { 63 deleteOne: { 64 filter: { "location.address.street1": "221b Baker St" }, 65 }, 66 }, 67 ]); 68 69 console.log(result); 70 } finally { 71 await client.close(); 72 } 73 } 74 run().catch(console.dir);
Ao executar o exemplo anterior, você verá a seguinte saída:
BulkWriteResult { insertedCount: 2, matchedCount: 1, modifiedCount: 1, deletedCount: 0, upsertedCount: 0, upsertedIds: {}, insertedIds: { '0': new ObjectId("..."), '1': new ObjectId("...") } }
Informações adicionais
Para saber mais sobre operações em massa, consulte Operações de gravação em massa no manual do MongoDB Server.
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: