Menu Docs

Operações em massa

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>.

Este guia inclui as seguintes seções:

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

Os exemplos neste guia usam as movies users collections e no sample_mflix banco de dados , 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 Iniciar com Atlas .

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:

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.

Este exemplo executa as seguintes ações:

  1. Especifica duas instâncias do InsertOneModel em uma array. Cada InsertOneModel representa um documento para inserir na coleção movies no banco de dados sample_mflix .

  2. Chama o método bulkWrite() na coleção movies e passa uma array de modelos como parâmetro.

  3. 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

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

namespace

The namespace in which to insert a document.
Type: String

name

The operation you want to perform. For insert operations, set this field to "insertOne".
Type: String

document

The document to insert.
Type: Document

Este exemplo executa as seguintes ações:

  1. Especifica três instâncias do ClientBulkWriteModel em uma array. Os dois primeiros modelos representam documentos a inserir na collection movies, e o último modelo representa um documento a ser inserido na collection users.

  2. Chama o método bulkWrite() em um cliente e passa uma array de modelos como um parâmetro.

  3. 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

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:

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

filter

The filter that matches the document you want to replace.
Type: Document

replacement

The replacement document.
Type: Document

collation

(Optional) The collation to use when sorting results. To learn more about collations, see the Collations guide.
Type: String or Object

hint

(Optional) The index to use for the operation. To learn more about indexes, see the Indexes guide.
Type: Bson

upsert

(Optional) Whether a new document is created if no document matches the filter.
By default, this field is set to false.
Type: Boolean

Este exemplo executa as seguintes ações:

  1. Especifica duas instâncias do ReplaceOneModel em uma array. As instâncias ReplaceOneModel contêm instruções para substituir documentos que representam filmes na coleção movies.

  2. Chama o método bulkWrite() na coleção movies e passa uma array de modelos como parâmetro.

  3. 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

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

namespace

The namespace in which to replace a document.
Type: String

name

The operation you want to perform. For replace operations, set this field to "replaceOne".
Type: String

filter

The filter that matches the document you want to replace.
Type: Document

replacement

The replacement document.
Type: Document

collation

(Optional) The collation to use when sorting results. To learn more about collations, see the Collations guide.
Type: String or Object

hint

(Optional) The index to use for the operation. To learn more about indexes, see the Indexes guide.
Type: Bson

Este exemplo executa as seguintes ações:

  1. Especifica três instâncias do ClientBulkWriteModel em uma array. Os dois primeiros modelos contêm instruções de substituição para documentos na collection movies e o último modelo contém instruções de substituição para um documento na collection users.

  2. Chama o método bulkWrite() em um cliente e passa uma array de modelos como um parâmetro.

  3. 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

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:

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

filter

The filter that matches one or more documents you want to update. When specified in an UpdateOneModel, only the first matching document will be updated. When specified in an UpdateManyModel, all matching documents will be updated.
Type: Document

update

The update to perform.
Type: Document

arrayFilters

(Optional) A set of filters specifying which array elements an update applies to if you are updating an array-valued field.
Type: Array

collation

(Optional) The collation to use when sorting results. To learn more about collations, see the Collations guide.
Type: Object

hint

(Optional) The index to use for the operation. To learn more about indexes, see the Indexes guide.
Type: String or Object

upsert

(Optional) Whether a new document is created if no document matches the filter. By default, this field is set to false.
Type: Boolean

Este exemplo executa as seguintes ações:

  1. Especifica uma instância UpdateOneModel e uma instância UpdateManyModel em uma array. Esses modelos contêm instruções para atualizar documentos que representam filmes na coleção movies.

  2. Chama o método bulkWrite() na coleção movies e passa uma array de modelos como parâmetro.

  3. 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

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

namespace

The namespace in which to update a document.
Type: String

name

The operation you want to perform. For update operations, set this field to "updateOne" or "updateMany".
Type: String

filter

The filter that matches one or more documents you want to update. If you set the model name to "updateOne", only the first matching document is updated. If you set name to "updateMany", all matching documents are updated.
Type: Document

update

The updates to perform.
Type: Document or Document[]

arrayFilters

(Optional) A set of filters specifying which array elements an update applies to if you are updating an array-valued field.
Type: Document[]

collation

(Optional) The collation to use when sorting results. To learn more about collations, see the Collations guide.
Type: Document

hint

(Optional) The index to use for the operation. To learn more about indexes, see the Indexes guide.
Type: Document or String

upsert

(Optional) Whether a new document is created if no document matches the filter. By default, this field is set to false.
Type: Boolean

Este exemplo executa as seguintes ações:

  1. Especifica duas instâncias do ClientBulkWriteModel em uma array. O primeiro modelo especifica uma operação de atualização muitos na coleção movies e o segundo modelo especifica uma operação de atualização um na coleção users.

  2. Chama o método bulkWrite() em um cliente e passa uma array de modelos como um parâmetro.

  3. 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

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:

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

filter

The filter that matches one or more documents you want to delete. When specified in a DeleteOneModel, only the first matching document will be deleted. When specified in a DeleteManyModel, all matching documents will be deleted.
Type: Document

collation

(Optional) The collation to use when sorting results. To learn more about collations, see the Collations guide.
Type: Object

hint

(Optional) The index to use for the operation. To learn more about indexes, see the Indexes guide.
Type: String or Object

Este exemplo executa as seguintes ações:

  1. Especifica uma instância DeleteOneModel e uma instância DeleteManyModel em uma array. Esses modelos contêm instruções para excluir documentos na coleção movies.

  2. Chama o método bulkWrite() na coleção movies e passa uma array de modelos como parâmetro.

  3. 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

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

namespace

The namespace in which to delete a document.
Type: String

name

The operation you want to perform. For delete operations, set this field to "deleteOne" or "deleteMany".
Type: String

filter

The filter that matches one or more documents you want to delete. If you set the model name to "deleteOne", only the first matching document is deleted. If you set name to "deleteMany", all matching documents are deleted.
Type: Document

hint

(Optional) The index to use for the operation. To learn more about indexes, see the Indexes guide.
Type: Document or String

collation

(Optional) The collation to use when sorting results. To learn more about collations, see the Collations guide.
Type: Document

Este exemplo executa as seguintes ações:

  1. Especifica duas instâncias do ClientBulkWriteModel em uma array. O primeiro modelo especifica uma operação para excluir muitos na collection movies e o segundo modelo especifica uma operação para excluir um na collection users.

  2. Chama o método bulkWrite() em um cliente e passa uma array de modelos como um parâmetro.

  3. 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

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

insertedCount

O número de documentos inseridos

matchedCount

O número de documentos correspondentes

modifiedCount

O número de documentos atualizados

upsertedCount

O número de documentos atualizados

deletedCount

O número de documentos excluídos

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

acknowledged

Um valor booleano indicando se a escrita em massa foi reconhecida

insertedCount

O número de documentos inseridos

matchedCount

O número de documentos correspondentes

modifiedCount

O número de documentos atualizados

upsertedCount

O número de documentos atualizados

deletedCount

O número de documentos excluídos

insertResults

Os resultados de cada operação de inserção individual bem-sucedida

updateResults

Os resultados de cada operação de atualização bem-sucedida individual

deleteResults

Os resultados de cada operação individual de exclusão bem-sucedida

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

message

The error message.
Type: String

writeErrors

An array of errors that occurred during the bulk write operation.
Type: BulkWriteError[]

writeConcernErrors

Write concern errors that occurred during execution of the bulk write operation.
Type: WriteConnectionError[]

result

The results of any successful operations performed before the exception was thrown.
Type: BulkWriteResult[]

err

The underlying error object, which may contain more details.
Type: Error

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

writeConcernErrors

An array of documents specifying each write concern error.
Type: Document[]

writeErrors

An map of errors that occurred during individual write operations.
Type: Map<number, ClientBulkWriteError>

partialResult

The partial result of the client bulk write that reflects the operation's progress before the error.
Type: ClientBulkWriteResult

Para saber mais sobre operações em massa, consulte Operações de gravação em massa no manual do MongoDB Server .

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: