Docs Menu
Docs Home
/ /

Operaciones de escritura masiva

En esta guía, puede aprender cómo realizar múltiples operaciones de escritura en una sola llamada de base de datos mediante operaciones de escritura masiva.

Imagine un escenario en el que desea insertar un documento en una colección, actualizar varios documentos y, finalmente, eliminar un documento. Si utiliza métodos individuales, cada operación requiere su propia llamada a la base de datos. En su lugar, puede usar una operación masiva para reducir el número de llamadas a la base de datos.

Los ejemplos de esta guía utilizan el restaurants colección en la base de datos sample_restaurants de la Conjuntos de datos de muestra de Atlas. Para acceder a esta colección desde su aplicación C++, cree una mongocxx::client instancia de que se conecte a un clúster de Atlas y asigne los siguientes valores a las variables db collection y:

auto db = client["sample_restaurants"];
auto collection = db["restaurants"];

Para aprender cómo crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte la guía de introducción a MongoDB.

Antes de ejecutar una operación de escritura masiva, llame al método create_bulk_write() en una colección. Este método devuelve una instancia de la clase mongocxx::bulk_write que puede usar para almacenar instrucciones sobre los tipos de escritura masiva que se deben realizar.

El siguiente ejemplo llama al método create_bulk_write() en la colección restaurants:

auto bulk = collection.create_bulk_write();

Luego, puede agregar modelos mongocxx::bulk_write de escritura a su instancia para definir la operación masiva. Para obtener más información,consulte la sección "Definir las operaciones de escritura".

Para cada operación de escritura que desee realizar, cree una instancia de una de las siguientes clases de modelo:

  • mongocxx::model::insert_one

  • mongocxx::model::update_one

  • mongocxx::model::update_many

  • mongocxx::model::replace_one

  • mongocxx::model::delete_one

  • mongocxx::model::delete_many

Luego, agregue cada modelo de escritura a la instancia mongocxx::bulk_write devuelta por el método create_bulk_write().

Las siguientes secciones muestran cómo crear y utilizar instancias de las clases del modelo de escritura anteriores.

Para realizar una operación de inserción, cree una instancia de la clase mongocxx::model::insert_one y especifique el documento que desea insertar. A continuación, añada la instancia del modelo a una instancia de la clase mongocxx::bulk_write.

El siguiente ejemplo crea una instancia de mongocxx::model::insert_one y la agrega a una instancia mongocxx::bulk_write llamada bulk:

auto insert_doc = make_document(kvp("name", "Mongo's Deli"),
kvp("cuisine", "Sandwiches"),
kvp("borough", "Manhattan"),
kvp("restaurant_id", "1234"));
mongocxx::model::insert_one insert_op{insert_doc.view()};
bulk.append(insert_op);

Para insertar varios documentos, cree una instancia de mongocxx::model::insert_one para cada documento.

Para actualizar un documento, cree una instancia mongocxx::model::update_one de. Este modelo indica al controlador que actualice el primer documento que coincida con el filtro de consulta. A continuación, añada la instancia del modelo a una instancia de la mongocxx::bulk_write clase.

Pase los siguientes argumentos al modelo mongocxx::model::update_one:

  • Filtro de consulta de documento, que especifica los criterios utilizados para buscar coincidencias en los documentos de su colección.

  • Documento de actualización, que especifica el tipo de actualización que se realizará. Para obtener más información sobre las operaciones de actualización, consulte la guía "Operadores de actualización de campos" en el manual de MongoDB Server.

El siguiente ejemplo crea una instancia de mongocxx::model::update_one y la agrega a una instancia mongocxx::bulk_write llamada bulk:

auto filter_doc = make_document(kvp("name", "Mongo's Deli"));
auto update_doc = make_document(kvp("$set", make_document(kvp("cuisine", "Sandwiches and Salads"))));
mongocxx::model::update_one update_op{filter_doc.view(), update_doc.view()};
bulk.append(update_op);

Para actualizar varios documentos, crea una instancia de mongocxx::model::update_many e ingresa los mismos argumentos. Este modelo indica al driver que actualice todos los documentos que coincidan con tu filtro de query.

El siguiente ejemplo crea una instancia de mongocxx::model::update_many y la agrega a bulk:

auto filter_doc = make_document(kvp("name", "Mongo's Deli"));
auto update_doc = make_document(kvp("$set", make_document(kvp("cuisine", "Sandwiches and Salads"))));
mongocxx::model::update_many update_op{filter_doc.view(), update_doc.view()};
bulk.append(update_op);

Una operación de reemplazo elimina todos los campos y valores de un documento específico y los reemplaza por otros nuevos. Para realizar una operación de reemplazo, cree una instancia de la clase mongocxx::model::replace_one y pásele un filtro de consulta, así como los campos y valores que desea almacenar en el documento correspondiente. A continuación, añada la instancia del modelo a una instancia de la clase mongocxx::bulk_write.

El siguiente ejemplo crea una instancia de mongocxx::model::replace_one y la agrega a una instancia mongocxx::bulk_write llamada bulk:

auto filter_doc = make_document(kvp("restaurant_id", "1234"));
auto replace_doc = make_document(kvp("name", "Mongo's Deli"),
kvp("cuisine", "Sandwiches and Salads"),
kvp("borough", "Brooklyn"),
kvp("restaurant_id", "5678"));
mongocxx::model::replace_one replace_op{filter_doc.view(), replace_doc.view()};
bulk.append(replace_op);

Para reemplazar varios documentos, debe crear una nueva instancia de mongocxx::model::replace_one para cada documento.

Para eliminar un documento, cree una instancia de la mongocxx::model::delete_one clase y pase un filtro de consulta que especifique el documento que desea eliminar. Este modelo indica al controlador que elimine solo el primer documento que coincida con el filtro de consulta. A continuación, añada la instancia del modelo a una instancia de la mongocxx::bulk_write clase.

El siguiente ejemplo crea una instancia de mongocxx::model::delete_one y la agrega a una instancia mongocxx::bulk_write llamada bulk:

auto filter_doc = make_document(kvp("restaurant_id", "5678"));
mongocxx::model::delete_one delete_op{filter_doc.view()};
bulk.append(delete_op);

Para eliminar varios documentos, cree una instancia de la mongocxx::model::delete_many clase y pase un filtro de consulta que especifique el documento que desea eliminar. Este modelo indica al controlador que elimine todos los documentos que coincidan con el filtro de consulta.

El siguiente ejemplo crea una instancia de mongocxx::model::delete_many y la agrega a bulk:

auto filter_doc = make_document(kvp("borough", "Manhattan"));
mongocxx::model::delete_many delete_op{filter_doc.view()};
bulk.append(delete_op);

Para ejecutar una operación masiva, llame al método execute() en una instancia de la clase mongocxx::bulk_write que contenga sus modelos de escritura. De forma predeterminada, el método execute() ejecuta las operaciones en el orden en que se añaden a la instancia mongocxx::bulk_write.

El siguiente ejemplo realiza las operaciones de inserción, actualización, reemplazo y eliminación especificadas en las secciones anteriores de esta guía. Para ello, añade cada modelo de escritura correspondiente a una instancia de mongocxx::bulk_write y llama al execute() método. A continuación, imprime el número de documentos modificados:

auto bulk = collection.create_bulk_write();
// Specifies documents to insert, update, replace, or delete
auto insert_doc = make_document(kvp("name", "Mongo's Deli"),
kvp("cuisine", "Sandwiches"),
kvp("borough", "Manhattan"),
kvp("restaurant_id", "1234"));
auto update_filter = make_document(kvp("name", "Mongo's Deli"));
auto update_doc = make_document(kvp("$set", make_document(kvp("cuisine", "Sandwiches and Salads"))));
auto replace_filter = make_document(kvp("restaurant_id", "1234"));
auto replace_doc = make_document(kvp("name", "Mongo's Deli"),
kvp("cuisine", "Sandwiches and Salads"),
kvp("borough", "Brooklyn"),
kvp("restaurant_id", "5678"));
auto delete_filter = make_document(kvp("borough", "Manhattan"));
// Creates write models for each write operation using the preceding documents
mongocxx::model::insert_one insert_op{insert_doc.view()};
mongocxx::model::update_many update_op{update_filter.view(), update_doc.view()};
mongocxx::model::replace_one replace_op{replace_filter.view(), replace_doc.view()};
mongocxx::model::delete_many delete_op{delete_filter.view()};
// Appends each write model to the bulk operation
bulk.append(insert_op);
bulk.append(update_op);
bulk.append(replace_op);
bulk.append(delete_op);
// Runs the bulk operation
auto result = bulk.execute();
std::cout << "Modified documents: " << result->modified_count() << std::endl;
Modified documents: 2

Si alguna de las operaciones de escritura falla, el controlador C++ genera un mongocxx::bulk_write_exception y no realiza ninguna operación adicional.

Tip

Para obtener más información sobre la modified_count() función, consulte la sección Valor de retorno de esta guía.

Puede modificar el comportamiento del método create_bulk_write() pasando una instancia de la clase mongocxx::options::bulk_write como parámetro. La siguiente tabla describe los campos que puede configurar en una instancia mongocxx::options::bulk_write:

Campo
Descripción

ordered

If true, the driver performs the write operations in the order provided. If an error occurs, the remaining operations are not attempted.

If false, the driver performs the operations in an arbitrary order and attempts to perform all operations.
Defaults to true.

bypass_document_validation

Specifies whether the operation bypasses document-level validation. For more information, see Schema Validation in the MongoDB Server manual.
Defaults to false.

write_concern

Specifies the write concern for the bulk operation. For more information, see Write Concern in the MongoDB Server manual.

comment

Attaches a comment to the operation. For more information, see the delete command fields guide in the MongoDB Server manual.

let

Specifies a document with a list of values to improve operation readability. Values must be constant or closed expressions that don't reference document fields. For more information, see the let statement in the MongoDB Server manual.

El siguiente ejemplo llama al create_bulk_write() método del ejemplo Crear una ordered instancia de mongocxx::options::bulk_write escritura masiva en esta página, pero establece el campo de una instancia false en:

mongocxx::options::bulk_write opts;
opts.ordered(false);
auto bulk = collection.create_bulk_write(opts);

Si alguna de las operaciones de escritura en una escritura masiva desordenada falla, el controlador de C++ informa los errores solo después de intentar todas las operaciones.

Nota

Las operaciones masivas desordenadas no garantizan el orden de ejecución. El orden puede variar según la forma en que se enumeran para optimizar el tiempo de ejecución.

El método execute() devuelve una instancia de la clase mongocxx::result::bulk_write. La clase mongocxx::result::bulk_write contiene las siguientes funciones miembro:

Función
Descripción

deleted_count()

Returns the number of documents deleted, if any.

inserted_count()

Returns the number of documents inserted, if any.

matched_count()

Returns the number of documents matched for an update, if applicable.

modified_count()

Returns the number of documents modified, if any.

upserted_count()

Returns the number of documents upserted, if any.

upserted_ids()

Returns a map of the operation's index to the _id of the upserted documents, if applicable.

Para aprender a realizar operaciones de escritura individuales, consulte las siguientes guías:

  • Insertar documentos

  • Update Documents

  • Delete Documents

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

Borrar

En esta página