Overview
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.
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.
Operación de reemplazo
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.
Ejemplo de reemplazo de un documento
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.
opciones
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 |
|---|---|
| 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. |
| Specifies the kind of language collation to use when sorting
results. For more information, see Collation
in the MongoDB Server manual. |
| 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. |
| Specifies the index to scan for documents that match the query filter.
For more information, see the hint field
in the MongoDB Server manual. |
| 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. |
| Specifies whether the replace operation performs an upsert operation if no
documents match the query filter. Defaults to false. |
| Sets the write concern for the operation.
For more information, see Write Concern
in the MongoDB Server manual. |
Ejemplo: Opción hint
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.
Ejemplo: opción de actualización e inserción
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
Valor de retorno
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 |
|---|---|
| Returns the number of documents that matched the query filter, regardless of
how many were replaced. |
| 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. |
| Returns the bulk write result for the operation. |
| Returns the ID of the document that was upserted in the database, if the driver
performed an upsert. |
Ejemplo: matched_count()
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
Ejemplo: upserted_id()
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
Información Adicional
Para obtener más información sobre cómo crear filtros de consulta, consulte la guía Especificar una consulta.
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: