Overview
En esta guía, puede aprender cómo utilizar el controlador C++ para actualizar documentos en una colección de MongoDB. Puedes llamar al método update_one() para actualizar un solo documento o al método update_many() para actualizar varios documentos.
Datos de muestra
Los ejemplos de esta guía utilizan la colección restaurants en la base de datos sample_restaurants de los conjuntos de datos de muestra de Atlas. Para acceder a esta colección desde tu aplicación en C++, instancia un mongocxx::client que se conecte a un clúster Atlas y asigna los siguientes valores a tus variables db y collection:
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 ejemplo, consulta la guía MongoDB Get Started.
Operaciones de actualizar
Puedes realizar operaciones de actualización en MongoDB utilizando los siguientes métodos:
update_one()que actualiza el primer documento que coincide con los criterios de búsquedaupdate_many(), que actualiza todos los documentos que coinciden con los criterios de búsqueda
Cada método de actualización requiere los siguientes parámetros:
Documento de filtro de query: Especifica qué documentos actualizar. Para obtener más información sobre los filtros de query, consulta la sección Documentos de filtros de query en el manual de MongoDB Server.
Actualizar documento: Especifica el operador de actualización, o el tipo de actualización a realizar, así como los campos y valores que se deben cambiar. Para obtener una lista de operadores de actualización y su uso, consulta la Guía de operadores de actualización de campos en el manual de MongoDB Server.
Actualizar un documento
El siguiente ejemplo utiliza el método update_one() para actualizar el valor name de un documento en la colección restaurants de "Bagels N Buns" a "2 Bagels 2 Buns":
auto query_filter = make_document(kvp("name", "Bagels N Buns")); auto update_doc = make_document(kvp("$set", make_document(kvp("name", "2 Bagels 2 Buns")))); auto result = collection.update_one(query_filter.view(), update_doc.view());
Actualizar muchos documentos
El siguiente ejemplo utiliza el método update_many() para actualizar todos los documentos que tengan un valor cuisine de "Pizza". Después de la actualización, los documentos tienen un cuisine valor de "Pasta".
auto query_filter = make_document(kvp("cuisine", "Pizza")); auto update_doc = make_document(kvp("$set", make_document(kvp("cuisine", "Pasta")))); auto result = collection.update_many(query_filter.view(), update_doc.view());
Opción de inserción o actualización
El parámetro upsert permite utilizar las operaciones update_one() y update_many() para realizar una operación condicional:
Si el documento especificado existe, el comando lo actualiza.
Si el documento especificado no existe, el comando creará un nuevo documento con el parámetro especificado.
Para obtener más información, consulte la sección Ejemplo de modificación de actualización o la tabla de opciones en esta página.
Personaliza la operación de actualizar
Puedes modificar el comportamiento de los métodos update_one() y update_many() pasando una instancia de la clase mongocxx::options::update como parámetro opcional. La siguiente tabla describe los campos que puede establecer en una instancia de mongocxx::options::update:
Campo | Descripción |
|---|---|
| Especifica si la operación de actualizar realiza una operación de inserción si ningún documento coincide con el filtro de query. Para obtener más información, consulta la instrucción de inserción en el manual de MongoDB Server. |
| Especifica si la operación de actualización omite la validación del documento. Esto permite actualizar documentos que no cumplen con los requisitos de validación del esquema, si los hubiera. Para obtener más información sobre la validación del esquema, consulte Validación de esquema en el manual del servidor MongoDB. |
| Especifica el tipo de intercalación de lenguaje a usar al ordenar los resultados. Para obtener más información, consulte intercalación en el manual de MongoDB Server. |
| Especifica a qué elementos del arreglo se aplica una actualización si la operación modifica los campos del arreglo. |
| Establece el índice para buscar documentos. Para más información, consulta la instrucción de pistas en el manual de MongoDB Server. |
| Establece el nivel de confirmación de escritura (write concern) para la operación. Para más información, consulta nivel de confirmación de escritura (Write Concern) en el manual de MongoDB Server. |
| Especifica un documento con una lista de valores para mejorar la legibilidad de la operación. Los valores deben ser expresiones constantes o cerradas que no hagan referencia a campos de documentos. Para obtener más información, consulta la instrucción let en el manual de MongoDB Server. |
| Un comentario para adjuntar a la operación. Para más información, consulta la guía insertar campos de comandos en el manual de MongoDB Server para obtener más información. |
Modificar ejemplo de actualización
El siguiente ejemplo utiliza el método update_many() para encontrar todos los documentos que tienen el valor borough de "Manhattan". Luego actualiza el valor borough de estos documentos a "Manhattan (north)".
Debido a que la opción upsert está configurada en true, si el filtro de query no coincide con ningún documento existente, el driver de C++ inserta un nuevo documento que contiene los campos y valores en los documentos del filtro y de actualizar.
mongocxx::options::update opts{}; opts.upsert(true); auto query_filter = make_document(kvp("borough", "Manhattan")); auto update_doc = make_document(kvp("$set", make_document(kvp("borough", "Manhattan (north)")))); auto result = collection.update_many(query_filter.view(), update_doc.view(), opts);
Valor de retorno
Los métodos update_one() y update_many() devuelven una instancia de la clase mongocxx::result::update. Esta clase contiene las siguientes funciones miembro:
Función | Descripción |
|---|---|
| Devuelve el número de documentos que coincidieron con el filtro de query, independientemente de cuántos se actualizaron. |
| Devuelve el número de documentos modificados por la operación de actualización. Si un documento actualizado es idéntico al original, no se incluye en este conteo. |
| Devuelve el documento del resultado sin procesar de la operación. |
| Devuelve el número de document que fueron insertados o actualizados en la base de datos. |
| Devuelve el ID del document que fue inserción en la base de datos, si el driver realizó una inserción. |
El siguiente ejemplo utiliza el método update_many() para actualizar el campo name de los documentos coincidentes de "Dunkin' Donuts" a "Dunkin'". Llama a la función nodo modified_count() para imprimir el número de documentos modificados:
auto query_filter = make_document(kvp("name", "Dunkin' Donuts")); auto update_doc = make_document(kvp("$set", make_document(kvp("name", "Dunkin'")))); auto result = collection.update_many(query_filter.view(), update_doc.view()); std::cout << "Modified documents: " << result->modified_count() << std::endl;
Modified documents: 206
Información Adicional
Para obtener más información sobre cómo crear filtros de query, se puede consultar la Especificar una query.
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: