Overview
En esta guía, puede aprender cómo usar el driver C++ para actualizar documentos en una colección de MongoDB. Puedes llamar a la update_one() método para actualizar un solo documento o el método update_many() para actualizar varios documentos.
Datos de muestra
Los ejemplos de esta guía usan la colección restaurants 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++, instancie un mongocxx::client que se conecte a un clúster de Atlas y asigne los siguientes valores a sus 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 Modificar ejemplo 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 |
|---|---|
| Specifies whether the update operation performs an upsert operation if no
documents match the query filter. For more information, see the upsert
statement
in the MongoDB Server manual. Defaults to false. |
| Specifies whether the update operation bypasses document validation. This lets you
update documents that don't meet the schema validation requirements, if any
exist. For more information about schema validation, see Schema
Validation in the MongoDB
Server manual. Defaults to false. |
| Specifies the kind of language collation to use when sorting
results. For more information, see Collation
in the MongoDB Server manual. |
| Specifies which array elements an update applies to if the operation modifies
array fields. |
| Sets the index to scan for documents.
For more information, see the hint statement
in the MongoDB Server manual. |
| Sets the write concern for the operation.
For more information, see Write Concern
in the MongoDB Server manual. |
| 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. |
| A comment to attach to the operation. For more information, see the insert command
fields guide in the
MongoDB Server manual for more information. |
Ejemplo de modificación y 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 |
|---|---|
| Returns the number of documents that matched the query filter, regardless of
how many were updated. |
| Returns number of documents modified by the update operation. If an updated
document is identical to the original, it is not included in this
count. |
| Returns the raw result document for the operation. |
| Returns the number of document that were upserted into the database. |
| Returns the ID of the document that was upserted in the database, if the driver
performed an upsert. |
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 miembro 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 consulta, consulte la Guía '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: