Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Reemplazar Documentos

En esta guía, puedes aprender a utilizar el controlador de C++ para ejecutar una operación de reemplazo en una colección de MongoDB. Una operación de reemplazo remueve todos los campos excepto el _id campo en el documento de destino y los reemplaza por otros nuevos. Puede llamar al método replace_one() para reemplazar un solo documento.

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.

Se puede realizar una operación de reemplazo llamando al método replace_one(). Este método elimina todos los campos excepto el campo _id del primer documento que coincide con los criterios de búsqueda. Luego inserta en el documento los campos y valores que especifiques.

El método replace_one() requiere los siguientes parámetros:

  • Documento de filtro de consulta: Especifica el documento que se reemplazará. Para obtener más información sobre los filtros de consulta, consulte "Documentos de filtro de consulta" en el manual de MongoDB Server.

  • Reemplazar documento: Especifica los campos y valores a insertar en el nuevo documento.

Importante

Los valores de los campos _id son inmutables. Si el documento de reemplazo especifica un valor para el campo _id, este debe coincidir con el valor _id del documento existente.

El siguiente ejemplo utiliza el método replace_one() para reemplazar un documento que tiene un valor de campo name de "Nobu" con un nuevo documento que tiene un valor de campo name de "La Bernadin":

auto query_filter = make_document(kvp("name", "Nobu"));
auto replace_doc = make_document(kvp("name", "La Bernadin"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view());

Para comprobar si reemplazaste con éxito el documento, puedes usar el método find_one() para imprimir el nuevo documento:

auto new_doc = collection.find_one(make_document(kvp("name", "La Bernadin")));
std::cout << "New document: " << bsoncxx::to_json(*new_doc) << std::endl;
New document: { "_id" : { "$oid" : "..." }, "name" : "La Bernadin" }

Para obtener más información sobre el find_one() método, consulta Busque un documento en la guía Recuperar datos.

Puede modificar el comportamiento del método replace_one() pasando una instancia de la clase mongocxx::options::replace como argumento opcional. La siguiente tabla describe los campos que puede configurar en una instancia mongocxx::options::replace:

Campo
Descripción

bypass_document_validation

Specifies whether the replace operation bypasses document validation. When set to true, this lets you replace a document with a new document that doesn't meet the schema validation requirements. For more information, see Schema Validation in the MongoDB Server manual.
Defaults to false.

collation

Specifies the kind of language collation to use when sorting results. For more information, see Collation in the MongoDB Server manual.

comment

Specifies a comment of any valid BSON type to attach to the operation. Once set, this comment appears alongside records of this command in the following locations:
For more information, see the insert Command Fields guide in the MongoDB Server manual.

hint

Specifies the index to scan for documents that match the query filter. For more information, see the hint field in the MongoDB Server manual.

let

Specifies a document containing variables and their values to be used in the replace_one() method. This allows you to improve code readability by separating the variables from the operation text. Values must be constant or closed expressions that don't reference document fields. For more information, see the let field in the MongoDB Server manual.

upsert

Specifies whether the replace operation performs an upsert operation if no documents match the query filter.
Defaults to false.

write_concern

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

El siguiente ejemplo utiliza el método create_index() para crear un índice ascendente de un solo campo en el campo name. A continuación, pasa un objeto mongocxx::options::replace al método replace_one() tras asignar el nuevo índice a su campo hint. Esto indica a la operación de reemplazo que busque en el índice del campo name al reemplazar un documento cuyo valor de campo name es "Nobu":

auto index_specification = make_document(kvp("name", 1));
collection.create_index(index_specification.view());
mongocxx::options::replace opts{};
opts.hint(mongocxx::hint{"name_1"});
auto query_filter = make_document(kvp("name", "Nobu"));
auto replace_doc = make_document(kvp("name", "La Bernadin"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view(), opts);

Para aprender más sobre los índices, consulta la guía Optimiza consultas con índices.

El siguiente ejemplo pasa un objeto mongocxx::options::replace al método replace_one() después de establecer el valor de su campo upsert en true. Dado que ningún documento coincide con el filtro de query, esto le indica a la operación de reemplazo que inserte un nuevo documento con un valor de campo name de "Shake Shack" en la colección:

std::cout << "Total document count before replace_one(): " << collection.count_documents({}) << std::endl;
mongocxx::options::replace opts{};
opts.upsert(true);
auto query_filter = make_document(kvp("name", "In-N-Out Burger"));
auto replace_doc = make_document(kvp("name", "Shake Shack"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view(), opts);
std::cout << "Total document count after replace_one(): " << collection.count_documents({}) << std::endl;
Total document count before replace_one(): 25359
Total document count after replace_one(): 25360

El método replace_one() retorna una instancia de la clase mongocxx::result::replace. Esta clase contiene las siguientes funciones miembro:

Función
Descripción

matched_count()

Returns the number of documents that matched the query filter, regardless of how many were replaced.

modified_count()

Returns number of documents modified by the replace operation. If a replaced document is identical to the original, it is not included in this count.

result()

Returns the bulk write result for the operation.

upserted_id()

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 replace_one() para reemplazar un documento que tiene un valor de campo name de "Shake Shack" por uno nuevo que tiene un valor de campo name de "In-N-Out Burger". Luego llama a la función nodo matched_count() para imprimir el número de documentos que coinciden con el filtro de query:

auto query_filter = make_document(kvp("name", "Shake Shack"));
auto replace_doc = make_document(kvp("name", "In-N-Out Burger"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view());
std::cout << "Matched documents: " << result->matched_count() << std::endl;
Matched documents: 11

El siguiente ejemplo utiliza el método replace_one() para reemplazar un documento que tiene un valor de campo name de "In-N-Out Burger". Debido a que la opción upsert está configurada en true, el driver de C++ inserta un nuevo documento cuando el filtro de query no coincide con ningún documento existente. Luego, el código llama a la función nodo upserted_id() para imprimir el valor del campo _id del documento upsertado:

mongocxx::options::replace opts{};
opts.upsert(true);
auto query_filter = make_document(kvp("name", "In-N-Out Burger"));
auto replace_doc = make_document(kvp("name", "Shake Shack"));
auto result = collection.replace_one(query_filter.view(), replace_doc.view(), opts);
auto id = result->upserted_id()->get_value();
std::cout << "Upserted ID: " << id.get_oid().value.to_string() << std::endl;
// Your ID value may differ
Upserted ID: 67128c5ecc1f8c15ea26fcf8

Para obtener más información sobre cómo crear filtros de consulta, consulte la guía Especificar una consulta.

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

Update

En esta página