Docs Menu
Docs Home
/ /

Operaciones masivas

En esta guía, aprenderá a usar el controlador de Node.js para realizar operaciones masivas. Estas operaciones ayudan a reducir el número de llamadas al servidor. En lugar de enviar una solicitud por cada operación, puede realizar varias operaciones en una sola acción.

Tip

Para obtener más información sobre las operaciones masivas, consulte Operaciones de escritura masiva en el manual del servidor MongoDB.

Puede usar operaciones masivas para realizar múltiples operaciones de escritura en una colección. También puede ejecutar operaciones masivas desde el cliente, lo que le permite realizar escrituras masivas en múltiples espacios de nombres. En MongoDB, un espacio de nombres consta del nombre de la base de datos y el nombre de la colección en el formato <database>.<collection>.

Nota

No hay límite para la cantidad de operaciones de escritura que un controlador puede gestionar. Los controladores agrupan los datos en lotes según el valor maxWriteBatchSize, que 100 es,000 y ​​no se puede modificar. Si el lote contiene más 100 de,000 operaciones, el controlador lo divide en grupos más pequeños con recuentos menores o iguales al valor maxWriteBatchSize. Por ejemplo, si la operación 250 contiene,000 operaciones, el controlador crea tres lotes: dos 100 con,000 operaciones y uno con,50 000 operaciones.

Esta guía incluye las siguientes secciones:

Importante

Requisitos de versión del servidor y del controlador

Las operaciones de escritura masiva a nivel de colección requieren las siguientes versiones:

  • Versión del servidor MongoDB 3.2 o posterior

  • Versión del controlador Node.js 3.6 o posterior

Las operaciones de escritura masiva a nivel de cliente requieren las siguientes versiones:

  • Versión del servidor MongoDB 8.0 o posterior

  • Versión del controlador Node.js 6.10 o posterior

Los ejemplos de esta guía utilizan las movies users colecciones y de la sample_mflix base de datos, incluida en los conjuntos de datos de ejemplo de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de ejemplo, consulte la guía de introducción a MongoDB.

Para realizar una operación de inserción masiva, cree un modelo de operación masiva para cada documento que desee insertar. A continuación, pase una lista de estos modelos al método bulkWrite().

En esta sección se describe cómo realizar los siguientes tipos de operaciones masivas:

Para realizar una operación de inserción masiva en su colección, cree un InsertOneModel para cada operación. Luego, llame al método bulkWrite() en su colección y pase una matriz de modelos como parámetro. Para crear un InsertOneModel, especifique el campo document del modelo y asígnele el documento que desea insertar.

Este ejemplo realiza las siguientes acciones:

  1. Especifica dos instancias InsertOneModel en una matriz. Cada InsertOneModel representa un documento que se insertará en la colección movies de la base de datos sample_mflix.

  2. Llama al método bulkWrite() en la colección movies y pasa una matriz de modelos como parámetro.

  3. Imprime el número de documentos insertados.

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 realizar una operación de inserción masiva en varias colecciones o bases de datos, cree un ClientBulkWriteModel para cada operación. Luego, llama al método bulkWrite() en tu cliente y pasa un arreglo de modelos como parámetro.

La siguiente tabla describe los campos que puede configurar en un ClientBulkWriteModel para especificar una operación de inserción:

Campo
Descripción

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 ejemplo realiza las siguientes acciones:

  1. Especifica tres instancias ClientBulkWriteModel en una matriz. Los dos primeros modelos representan documentos que se insertarán en la colección movies y el último modelo representa un documento que se insertará en la colección users.

  2. Llama al método bulkWrite() en un cliente y pasa una matriz de modelos como parámetro.

  3. Imprime el número de documentos insertados.

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 realizar una operación de reemplazo masivo, cree un modelo de operación masiva para cada documento que desee reemplazar. Luego, pase una lista de estos modelos al método bulkWrite().

En esta sección se describe cómo realizar los siguientes tipos de operaciones masivas:

Para realizar un reemplazo masivo en su colección, cree un ReplaceOneModel para cada operación. Luego, llame al método bulkWrite() en su colección y pase un array de modelos como parámetro.

La siguiente tabla describe los campos que puedes configurar en un ReplaceOneModel:

Campo
Descripción

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 Collation section of the Configure CRUD Operations guide.
Type: String or Object

hint

(Optional) The index to use for the operation. To learn more about indexes, see the Indexes for Query Optimization 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 ejemplo realiza las siguientes acciones:

  1. Especifica dos instancias ReplaceOneModel en una matriz. Las instancias ReplaceOneModel contienen instrucciones para reemplazar documentos que representan películas en la colección movies.

  2. Llama al método bulkWrite() en la colección movies y pasa una matriz de modelos como parámetro.

  3. Imprime el 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 realizar una operación de reemplazo masivo en varias colecciones o bases de datos, cree un ClientBulkWriteModel para cada operación. Luego, llame al método bulkWrite() en su cliente y pase una matriz de modelos como parámetro.

La siguiente tabla describe los campos que puede configurar en un ClientBulkWriteModel para especificar una operación de reemplazo:

Campo
Descripción

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 Collation section of the Configure CRUD Operations guide.
Type: String or Object

hint

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

Este ejemplo realiza las siguientes acciones:

  1. Especifica tres instancias ClientBulkWriteModel en una matriz. Los dos primeros modelos contienen instrucciones de reemplazo para documentos de la colección movies, y el último modelo contiene instrucciones de reemplazo para un documento de la colección users.

  2. Llama al método bulkWrite() en un cliente y pasa una matriz de modelos como parámetro.

  3. Imprime el 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 realizar una actualización masiva, cree un modelo de operación masiva para cada actualización que desee realizar. Luego, pase una lista de estos modelos al método bulkWrite().

En esta sección se describe cómo realizar los siguientes tipos de operaciones masivas:

Para realizar una actualización masiva en su colección, cree un UpdateOneModel o un UpdateManyModel para cada operación. Luego, llame al método bulkWrite() en su colección y pase un array de modelos como parámetro. Un UpdateOneModel actualiza solo un documento que coincide con un filtro, mientras que un UpdateManyModel actualiza todos los documentos que coinciden con un filtro.

La siguiente tabla describe los campos que puedes configurar en UpdateOneModel o UpdateManyModel:

Campo
Descripción

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 Collation section of the Configure CRUD Operations guide.
Type: Object

hint

(Optional) The index to use for the operation. To learn more about indexes, see the Indexes for Query Optimization 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 ejemplo realiza las siguientes acciones:

  1. Especifica una instancia UpdateOneModel y una UpdateManyModel en una matriz. Estos modelos contienen instrucciones para actualizar los documentos que representan películas en la colección movies.

  2. Llama al método bulkWrite() en la colección movies y pasa una matriz de modelos como parámetro.

  3. Imprime el 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 realizar una actualización masiva en varias colecciones o bases de datos, cree un ClientBulkWriteModel para cada operación. A continuación, llame al método bulkWrite() en su cliente y pase una matriz de modelos como parámetro.

La siguiente tabla describe los campos que puede configurar en un ClientBulkWriteModel para especificar una operación de actualización:

Campo
Descripción

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 Collation section of the Configure CRUD Operations guide.
Type: Document

hint

(Optional) The index to use for the operation. To learn more about indexes, see the Indexes for Query Optimization 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 ejemplo realiza las siguientes acciones:

  1. Especifica dos instancias ClientBulkWriteModel en una matriz. El primer modelo especifica una operación de actualización múltiple en la colección movies, y el segundo modelo especifica una operación de actualización única en la colección users.

  2. Llama al método bulkWrite() en un cliente y pasa una matriz de modelos como parámetro.

  3. Imprime el 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 realizar una operación de eliminación masiva, cree un modelo de operación masiva para cada operación de eliminación. A continuación, pase una lista de estos modelos al método bulkWrite().

En esta sección se describe cómo realizar los siguientes tipos de operaciones masivas:

Para realizar una operación de eliminación masiva en su colección, cree un DeleteOneModel o un DeleteManyModel para cada operación. Luego, llame al método bulkWrite() en su colección y pase un array de modelos como parámetro. Un DeleteOneModel elimina solo un documento que coincide con un filtro, mientras que un DeleteManyModel elimina todos los documentos que coinciden con un filtro.

La siguiente tabla describe los campos que puedes configurar en DeleteOneModel o DeleteManyModel:

Campo
Descripción

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 Collation section of the Configure CRUD Operations guide.
Type: Object

hint

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

Este ejemplo realiza las siguientes acciones:

  1. Especifica una instancia DeleteOneModel y una DeleteManyModel en una matriz. Estos modelos contienen instrucciones para eliminar documentos de la colección movies.

  2. Llama al método bulkWrite() en la colección movies y pasa una matriz de modelos como parámetro.

  3. Imprime el número de documentos eliminados.

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 realizar una operación de eliminación masiva en varias colecciones o bases de datos, cree un ClientBulkWriteModel para cada operación. Luego, llame al método bulkWrite() en su cliente y pase una matriz de modelos como parámetro.

La siguiente tabla describe los campos que puede configurar en un ClientBulkWriteModel para especificar una operación de eliminación:

Campo
Descripción

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 for Query Optimization guide.
Type: Document or String

collation

(Optional) The collation to use when sorting results. To learn more about collations, see the Collation section of the Configure CRUD Operations guide.
Type: Document

Este ejemplo realiza las siguientes acciones:

  1. Especifica dos instancias ClientBulkWriteModel en una matriz. El primer modelo especifica una operación de eliminación múltiple en la colección movies, y el segundo modelo especifica una operación de eliminación única en la colección users.

  2. Llama al método bulkWrite() en un cliente y pasa una matriz de modelos como parámetro.

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

El método Collection.bulkWrite() devuelve un objeto BulkWriteResult, que proporciona información sobre su operación masiva.

Las siguientes tablas describen los campos de un objeto BulkWriteResult:

Campo
Descripción

insertedCount

El número de documentos insertados

matchedCount

El número de documentos coincidentes

modifiedCount

El número de documentos actualizados

upsertedCount

El número de documentos insertados

deletedCount

La cantidad de documentos borrados

El método MongoClient.bulkWrite() devuelve un objeto ClientBulkWriteResult, que incluye información sobre la operación de escritura masiva del cliente.

Las siguientes tablas describen los campos de un objeto ClientBulkWriteResult:

Campo
Descripción

acknowledged

Un valor booleano que indica si se reconoció la escritura masiva

insertedCount

El número de documentos insertados

matchedCount

El número de documentos coincidentes

modifiedCount

El número de documentos actualizados

upsertedCount

El número de documentos insertados

deletedCount

La cantidad de documentos borrados

insertResults

Los resultados de cada operación de inserción individual exitosa

updateResults

Los resultados de cada operación de actualización individual exitosa

deleteResults

Los resultados de cada operación de borrado individual exitosa

Si alguna operación de escritura masiva realizada en una colección no se ejecuta correctamente, el controlador de Node.js genera un MongoBulkWriteError y no realiza ninguna operación adicional si la opción ordered está establecida en true. Si la opción ordered está establecida en false, intentará continuar con las operaciones posteriores.

Tip

Para obtener más información sobre operaciones masivas ordenadas y no ordenadas, consulte la sección Operaciones ordenadas vs. no ordenadas en la guía Escritura masiva del manual de MongoDB Server.

Un objeto MongoBulkWriteError contiene las siguientes propiedades:

Propiedad
Descripción

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

Si alguna operación de escritura masiva realizada en su cliente no se ejecuta correctamente, el controlador de Node.js genera un MongoClientBulkWriteError. De forma predeterminada, el controlador no realiza ninguna operación posterior tras detectar un error. Si pasa la opción ordered al método bulkWrite() y la establece en false, el controlador continúa intentando las operaciones restantes.

Un objeto MongoClientBulkWriteError contiene las siguientes propiedades:

Propiedad
Descripción

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

Nota

Configuración de ejemplo

Este ejemplo se conecta a una instancia de MongoDB con un URI de conexión. Para obtener más información sobre cómo realizar la conexión a la instancia de MongoDB, se debe consultar la guía Conexión a MongoDB. Este ejemplo también usa la colección movies en la base de datos sample_mflix incluida en los conjuntos de datos de muestra de Atlas. Se pueden cargar en la base de datos en el nivel gratuito de MongoDB Atlas siguiendo la guía de Introducción a MongoDB.

El siguiente código es un archivo completo e independiente que realiza una operación de escritura masiva en la colección theaters de la base de datos sample_mflix. El parámetro operations incluye ejemplos de operaciones de escritura insertOne, updateMany y deleteOne:

1// Bulk write operation
2
3// Import MongoClient from the MongoDB node driver package
4const { MongoClient } = require("mongodb");
5
6// Replace the uri string with your MongoDB deployment's connection string
7const uri = "<connection string uri>";
8
9const client = new MongoClient(uri);
10
11async 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}
66run().catch(console.dir);
1import { MongoClient } from "mongodb";
2
3// Replace the uri string with your MongoDB deployment's connection string.
4const uri = "<connection string uri>";
5
6const client = new MongoClient(uri);
7
8interface Address {
9 street1: string;
10 city: string;
11 state: string;
12 zipcode: string;
13}
14
15interface Theater {
16 location: { address: Address };
17 is_in_ohio?: boolean;
18}
19
20async 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}
74run().catch(console.dir);

Al ejecutar el ejemplo anterior, se produce el siguiente resultado:

BulkWriteResult {
insertedCount: 2,
matchedCount: 1,
modifiedCount: 1,
deletedCount: 0,
upsertedCount: 0,
upsertedIds: {},
insertedIds: {
'0': new ObjectId("..."),
'1': new ObjectId("...")
}
}

Para obtener más información sobre operaciones masivas, consulte Operaciones de escritura masiva en el manual de MongoDB Server.

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API:

Volver

Delete Documents