Realizar operações em massa
O método bulkWrite()
executa operações de gravação em lote em uma coleção. Esse método reduz o número de viagens de ida e volta de rede do aplicativo para o servidor, o que, portanto, aumenta a taxa de transferência e o desempenho. As gravações em massa retornam uma coleção de resultados para todas as operações somente depois que todas as operações passadas para o método forem concluídas.
Você pode especificar uma ou mais das seguintes operações de gravação no bulkWrite()
:
insertOne
updateOne
updateMany
deleteOne
deleteMany
replaceOne
O método bulkWrite()
aceita os seguintes parâmetros:
operations
: especifica as operações de gravação em massa a serem executadas. Passe cada operação parabulkWrite()
como um objeto em uma array. Para obter exemplos que mostram a sintaxe de cada operação de gravação, consulte a documentação da API bulletWrite.options
: configurações opcionais que afetam a execução da operação, por exemplo, a preocupação de gravação e se as operações de gravação são executadas em ordem sequencial ou não.Por padrão, o MongoDB executa operações de gravação em massa uma a uma na ordem especificada (em série). Durante uma gravação em massa ordenada, se ocorrer um erro durante o processamento de uma operação, o MongoDB retornará sem processar as operações restantes na lista. Em comparação, quando
ordered
éfalse
, o MongoDB continua processando as operações de gravação restantes na lista. As operações não ordenadas são teoricamente mais rápidas, já que o MongoDB pode executá-las em paralelo, mas só pode usá-las se as gravações não dependerem da ordem.
Se você criar um índice com uma restrição de índice exclusivo, poderá encontrar um erro de gravação de chave duplicada durante uma operação no seguinte formato:
Error during bulkWrite, BulkWriteError: E11000 duplicate key error collection: ...
Da mesma forma, se você tentar executar uma gravação em massa em uma coleção que usa validação de esquema, você poderá encontrar avisos ou erros relacionados à formatação de documentos inseridos ou modificados.
Exemplo
O exemplo de código a seguir executa uma operação de gravação em massa na coleção theaters
do banco de dados sample_mflix
. O exemplo de chamada para bulkWrite()
inclui exemplos de operações de gravação insertOne
, updateMany
e deleteOne
:
Observação
Você pode utilizar este exemplo para se conectar a uma instância do MongoDB e interagir com um banco de dados que contém dados de amostra. Para saber mais sobre como se conectar à sua instância do MongoDB e carregar um conjunto de dados de amostra, consulte o guia Exemplos de uso.
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("...") } }