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

Antes de ejecutar una operación de escritura masiva, llame a la función mongoc_collection_create_bulk_operation_with_opts(). Esta función devuelve un valor de tipo mongoc_bulk_operation_t que puede usar para almacenar instrucciones sobre qué operaciones de escritura masiva realizar.

La función mongoc_collection_create_bulk_operation_with_opts() acepta los siguientes parámetros:

  • Colección: Especifica la colección a modificar

  • Documento de opciones: especifica opciones para personalizar la operación, o NULL

El siguiente ejemplo llama a la función mongoc_collection_create_bulk_operation_with_opts() y pasa la colección restaurants como parámetro:

mongoc_bulk_operation_t *bulk =
mongoc_collection_create_bulk_operation_with_opts(collection, NULL);

Luego puedes agregar instrucciones para guardar a la operación masiva. Para obtener más información, consulta la siguiente sección Definición de las operaciones de guardado.

Puede definir una operación de escritura y agregarla a la escritura masiva llamando a los siguientes métodos:

  • mongoc_bulk_operation_insert_with_opts()

  • mongoc_bulk_operation_update_one_with_opts()

  • mongoc_bulk_operation_update_many_with_opts()

  • mongoc_bulk_operation_replace_one_with_opts()

  • mongoc_bulk_operation_remove_one_with_opts()

  • mongoc_bulk_operation_remove_many_with_opts()

Las siguientes secciones muestran cómo utilizar estos métodos para especificar sus operaciones de escritura correspondientes.

Para realizar una operación de inserción, agregue las instrucciones de inserción al mongoc_bulk_operation_t, lo que pone en cola la operación como parte de la escritura masiva.

El siguiente ejemplo llama a la función mongoc_bulk_operation_insert_with_opts(), pasando el documento a insertar y el valor mongoc_bulk_operation_t como parámetros:

bson_t *insert_doc = BCON_NEW(
"name", BCON_UTF8("Mongo's Deli"),
"cuisine", BCON_UTF8("Sandwiches"),
"borough", BCON_UTF8("Manhattan"),
"restaurant_id", BCON_UTF8("1234")
);
bson_error_t error;
if (!mongoc_bulk_operation_insert_with_opts(bulk, insert_doc, NULL, &error)) {
fprintf(stderr, "Failed to add insert operation: %s\n", error.message);
}
bson_destroy(insert_doc);

Para insertar varios documentos, llame a mongoc_bulk_operation_insert_with_opts() para cada documento.

Para realizar una operación de actualización, agregue las instrucciones de actualización a mongoc_bulk_operation_t, lo que pone en cola la operación como parte de la escritura masiva.

El siguiente ejemplo llama a la función mongoc_bulk_operation_update_one_with_opts(), pasando un filtro de consulta, actualizaciones de documentos y el valor mongoc_bulk_operation_t como parámetros:

bson_t *filter_doc = BCON_NEW("name", BCON_UTF8("Mongo's Deli"));
bson_t *update_doc = BCON_NEW("$set", "{", "cuisine", BCON_UTF8("Sandwiches and Salads"), "}");
bson_error_t error;
if (!mongoc_bulk_operation_update_one_with_opts(bulk, filter_doc, update_doc, NULL, &error)) {
fprintf(stderr, "Failed to add update operation: %s\n", error.message);
}
bson_destroy(filter_doc);
bson_destroy(update_doc);

Para actualizar varios documentos, llame mongoc_bulk_operation_update_many_with_opts() a y pase los mismos parámetros. Esto indica al controlador que actualice todos los documentos que coincidan con su filtro de consulta.

El siguiente ejemplo pone en cola una operación de actualización múltiple para la escritura masiva:

bson_t *filter_doc = BCON_NEW("name", BCON_UTF8("Mongo's Deli"));
bson_t *update_doc = BCON_NEW("$set", "{", "cuisine", BCON_UTF8("Sandwiches and Salads"), "}");
bson_error_t error;
if (!mongoc_bulk_operation_update_many_with_opts(bulk, filter_doc, update_doc, NULL, &error)) {
fprintf(stderr, "Failed to add update operation: %s\n", error.message);
}
bson_destroy(filter_doc);
bson_destroy(update_doc);

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, añada las instrucciones de reemplazo a mongoc_bulk_operation_t, lo que pone la operación en cola como parte de la escritura masiva.

El siguiente ejemplo llama a la función mongoc_bulk_operation_replace_one_with_opts(), pasando un filtro de consulta, un documento de reemplazo y el valor mongoc_bulk_operation_t como parámetros:

bson_t *filter_doc = BCON_NEW("restaurant_id", BCON_UTF8("1234"));
bson_t *replace_doc = BCON_NEW(
"name", BCON_UTF8("Mongo's Deli"),
"cuisine", BCON_UTF8("Sandwiches and Salads"),
"borough", BCON_UTF8("Brooklyn"),
"restaurant_id", BCON_UTF8("5678")
);
bson_error_t error;
if (!mongoc_bulk_operation_replace_one_with_opts(bulk, filter_doc, replace_doc, NULL, &error)) {
fprintf(stderr, "Failed to add replace operation: %s\n", error.message);
}
bson_destroy(filter_doc);
bson_destroy(replace_doc);

Para reemplazar varios documentos, llame a mongoc_bulk_operation_replace_one_with_opts() para cada documento.

Para realizar una operación de eliminación, agregue las instrucciones de eliminación a mongoc_bulk_operation_t, lo que pone en cola la operación como parte de la escritura masiva.

El siguiente ejemplo llama a la función mongoc_bulk_operation_remove_one_with_opts(), pasando un filtro de consulta y el valor mongoc_bulk_operation_t como parámetros:

bson_t *filter_doc = BCON_NEW("restaurant_id", BCON_UTF8("5678"));
bson_error_t error;
if (!mongoc_bulk_operation_remove_one_with_opts(bulk, filter_doc, NULL, &error)) {
fprintf(stderr, "Failed to add delete operation: %s\n", error.message);
}
bson_destroy(filter_doc);

Para eliminar varios documentos, llame a la mongoc_bulk_operation_remove_many_with_opts() función y pase los mismos parámetros. Esto indica al controlador que elimine todos los documentos que coincidan con el filtro de consulta.

El siguiente ejemplo pone en cola una operación de eliminación múltiple para la escritura masiva:

bson_t *filter_doc = BCON_NEW("borough", BCON_UTF8("Manhattan"));
bson_error_t error;
if (!mongoc_bulk_operation_remove_many_with_opts(bulk, filter_doc, NULL, &error)) {
fprintf(stderr, "Failed to add delete operation: %s\n", error.message);
}
bson_destroy(filter_doc);

Para ejecutar cada operación de escritura en cola en la escritura masiva, llame a la función mongoc_bulk_operation_execute(). Esta función acepta los siguientes parámetros:

  • Valor de mongoc_bulk_operation_t: contiene las instrucciones para cada operación de escritura

  • Ubicación de los resultados: especifica un puntero al almacenamiento sobrescribible que contendrá los resultados de la operación, o NULL

  • Ubicación del error: especifica una ubicación para un valor de error o NULL

Utilice la siguiente sintaxis para escribir documentos en masa:

bson_error_t error;
mongoc_bulk_operation_t *bulk =
mongoc_collection_create_bulk_operation_with_opts(collection, NULL);
bson_t *insert_doc = BCON_NEW(
"<field name>", BCON_UTF8("<value>"),
"<field name>", BCON_UTF8("<value>"),
"<field name>", BCON_UTF8("<value>"),
"<field name>", BCON_UTF8("<value>")
);
mongoc_bulk_operation_insert(bulk, insert_doc);
bson_destroy(insert_doc);
bson_t *query = BCON_NEW("<field to match>", BCON_UTF8("<value to match>"));
bson_t *update = BCON_NEW("$set", "{", "<field name>", BCON_UTF8("<value>"), "}");
mongoc_bulk_operation_update_one(bulk, query, update, false);
bson_destroy(query);
bson_destroy(update);
bool result = mongoc_bulk_operation_execute(bulk, NULL, &error);
if (!result) {
fprintf(stderr, "Bulk operation error: %s\n", error.message);
}
mongoc_bulk_operation_destroy(bulk);

El siguiente ejemplo realiza las operaciones de inserción, actualización, reemplazo y eliminación especificadas en las secciones anteriores de esta guía llamando a la mongoc_bulk_operation_execute() función:

bson_error_t error;
bool result = mongoc_bulk_operation_execute(bulk, NULL, &error);
if (!result) {
printf("Bulk operation error: %s\n", error.message);
}
mongoc_bulk_operation_destroy(bulk);

Si alguna de las operaciones de escritura falla, el controlador C establece el error de salida y no realiza ninguna operación adicional.

Puede modificar el comportamiento de la función mongoc_collection_create_bulk_operation_with_opts() pasando un documento BSON que especifique los valores de las opciones. La siguiente tabla describe las opciones que puede configurar en el documento:

Opción
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.

writeConcern

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

sessionId

Runs the bulk operations within the specified session. For more information, see Server Sessions 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 a la función mongoc_collection_create_bulk_operation_with_opts() y establece la opción ordered en false:

bson_t opts;
BSON_APPEND_BOOL(&opts, "ordered", false);
bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts);
// Perform bulk operation
bson_destroy(&opts);
mongoc_bulk_operation_destroy(bulk);

Si alguna de las operaciones de escritura en una escritura masiva desordenada falla, el controlador 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.

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

  • Insertar documentos

  • Update Documents

  • Delete Documents

  • Reemplazar Documentos

Para obtener más información sobre cualquiera de las funciones o tipos analizados en esta guía, consulte la siguiente documentación de API:

Volver

Borrar

En esta página