Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

Supervisar los cambios en los datos

En esta guía, puedes aprender a utilizar un flujo de cambios para supervisar los cambios en tiempo real de tu base de datos. Un flujo de cambios es una funcionalidad de MongoDB Server que permite que la aplicación se suscriba a cambios en los datos de una colección, base de datos o implementación.

Al usar el driver de C++, puedes instanciar un mongocxx::change_stream para supervisar los cambios de datos.

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.

Para abrir un flujo de cambios, llama al método watch(). La instancia en la que se llama al método watch() determina el alcance de los eventos para los que el flujo de cambios escucha. Puedes llamar al método watch() en las siguientes clases:

  • mongocxx::client: Supervisa todos los cambios en la implementación de MongoDB

  • mongocxx::databaseSupervisar los cambios en todas las colecciones de la base de datos

  • mongocxx::collectionSupervise los cambios en la colección

El siguiente ejemplo abre un flujo de cambios en la colección restaurants y muestra los cambios a medida que ocurren:

auto stream = collection.watch();
while (true) {
for (const auto& event : stream) {
std::cout << bsoncxx::to_json(event) << std::endl;
}
}

Para comenzar a observar los cambios, ejecuta el código anterior. Luego, en una aplicación o shell separado, modifica la colección restaurants. El siguiente ejemplo actualiza un documento que tiene un valor de campo name de Blarney Castle:

auto result = collection.update_one(make_document(kvp("name", "Blarney Castle")),
make_document(kvp("$set",
make_document(kvp("cuisine", "Irish")))));

Cuando actualizas la colección, la aplicación del flujo de cambios imprime el cambio a medida que ocurre. El evento de cambio impreso se asemeja al siguiente resultado:

{ "_id" : { "_data" : "..." }, "operationType" : "update", "clusterTime" :
{ "$timestamp" : { ... }, "wallTime" : { "$date" : ... }, "ns" :
{ "db" : "sample_restaurants", "coll" : "restaurants" }, "documentKey" :
{ "_id" : { "$oid" : "..." } }, "updateDescription" : { "updatedFields" :
{ "cuisine" : "Irish" }, "removedFields" : [ ], "truncatedArrays" : [ ] } }

Puedes pasar una instancia de mongocxx::pipeline como argumento al método watch() para modificar la salida del flujo de cambios. La siguiente lista incluye algunos de los campos mongocxx::pipeline que puedes configurar llamando a sus correspondientes métodos set:

  • add_fields: añade nuevos campos a documentos

  • matchFiltra los documentos

  • project: Proyecta un subconjunto de los campos del documento

  • redact: Restringe los contenidos de los documentos

  • group: Agrupa documentos por una expresión especificada

  • merge: Emite los resultados a una colección

Tip

Para una lista completa de campos de mongocxx::pipeline, consulta la documentación de la API mongocxx::pipeline.

El siguiente ejemplo establece el campo match de una instancia mongocxx::pipeline y luego pasa la pipeline al método watch(). Esto le indica al método watch() que solo genere operaciones de actualización:

mongocxx::pipeline pipeline;
pipeline.match(make_document(kvp("operationType", "update")));
auto stream = collection.watch(pipeline);
while (true) {
for (const auto& event : stream) {
std::cout << bsoncxx::to_json(event) << std::endl;
}
}

Puede modificar el comportamiento del método watch() pasando una instancia de la clase mongocxx::options::change_stream como parámetro. La siguiente tabla describe los campos que puedes establecer en una instancia de mongocxx::options::find:

Campo
Descripción

full_document

Especifica si se debe mostrar el documento completo después de la modificación, en lugar de mostrar solo los cambios realizados. Para obtener más información sobre esta opción, consulte Incluir imágenes previas y posteriores.

full_document_before_change

Especifica si se debe mostrar el documento completo tal como estaba antes del cambio, en lugar de mostrar solo las modificaciones realizadas en el documento. Para obtener más información sobre esta opción, consulte Incluir imágenes previas y posteriores.

resume_after

Indica watch() a que reanude la devolución de cambios después de la operación especificada en el token de reanudación.
Cada documento de evento de flujo de cambios incluye un token de reanudación como el _id campo. Pase el _id campo completo del documento de evento de cambio que representa la operación que desea reanudar.
resume_after es mutuamente excluyente con start_after start_at_operation_timey.

start_after

Indica a watch() que inicie un nuevo flujo de cambios tras la operación especificada en el token de reanudación. Este campo permite que las notificaciones se reanuden tras un evento de invalidación.
Cada documento de evento de flujo de cambios incluye un token de reanudación como _id campo. Pase el _id campo completo del documento de evento de cambio que representa la operación que desea reanudar.
start_after es mutuamente excluyente con resume_after start_at_operation_timey.

start_at_operation_time

Indica watch() a que devuelva solo los eventos que ocurran después de la marca de tiempo especificada.
start_at_operation_time es mutuamente excluyente con resume_after start_aftery.

max_await_time_ms

Establece la cantidad máxima de tiempo, en milisegundos, que el servidor espera para nuevos cambios de datos para informar al cursor de flujo de cambios antes de devolver un lote vacío. Por defecto, 1000 milisegundos.

batch_size

Establece el número máximo de eventos de cambio que se devolverán en cada agrupar de la respuesta del clúster de MongoDB.

collation

Establece la intercalación para usar con el cursor del flujo de cambios.

comment

Adjunta un comentario a la operación.

Importante

Puede habilitar pre imágenes y post imágenes en colecciones solo si su implementación utiliza MongoDB v6.0 o posterior.

Por defecto, cuando realizas una operación en una colección, el evento de cambio correspondiente incluye solo el delta de los campos modificados por esa operación. Para ver el documento completo antes o después de un cambio, especifica los campos full_document_before_change o full_document de una instancia de mongocxx::options::change_stream.

La preimagen es la versión completa de un documento antes de un cambio. Para incluir la preimagen en el evento de flujo de cambios, debes establecer el campo full_document_before_change en una de las siguientes cadenas:

  • "whenAvailable": El evento de cambio incluye una preimagen del documento modificado para los eventos de cambio solo si la preimagen está disponible.

  • "required"El evento de cambio incluye una preimagen del documento modificado para los eventos de cambio. Si la preimagen no está disponible, el driver genera un error.

La imagen posterior es la versión completa de un documento después de un cambio. Para incluir la imagen posterior en el evento de flujo de cambios, establezca el campo full_document en una de las siguientes cadenas:

  • "updateLookup": El evento de cambio incluye una copia de todo el documento cambiado a partir de cierto tiempo después del cambio.

  • "whenAvailable": El evento de cambio incluye una postimagen del documento modificado para eventos de cambio solo si la postimagen está disponible.

  • "required": El evento de cambio incluye una imagen posterior del documento modificado para eventos de cambio. Si la imagen posterior no está disponible, el driver genera un error.

El siguiente ejemplo llama al método watch() en una colección e incluye la postimagen de los documentos actualizados al configurar el campo full_document de una instancia mongocxx::options::change_stream:

mongocxx::options::change_stream opts;
opts.full_document("updateLookup");
auto stream = collection.watch(opts);
while (true) {
for (const auto& event : stream) {
std::cout << bsoncxx::to_json(event) << std::endl;
}
}

Con la aplicación del flujo de cambios en ejecución, al actualizar un documento en la colección restaurants mediante el ejemplo de actualización anterior se imprime un evento de cambio que se asemeja al siguiente código:

{ "_id" : { "_data" : "..." }, "operationType" : "update", "clusterTime" :
{ "$timestamp" : { ... } }, "wallTime" : { "$date" : ... },
"fullDocument" : { "_id" : { "$oid" : "..." }, "address" : { "building" : "202-24",
"coord" : [ -73.925044200000002093, 40.559546199999999772 ], "street" :
"Rockaway Point Boulevard", "zipcode" : "11697" }, "borough" : "Queens", "cuisine" :
"Irish", "grades" : [ ... ], "name" : "Blarney Castle", "restaurant_id" : "40366356" },
"ns" : { "db" : "sample_restaurants", "coll" : "restaurants" }, "documentKey" :
{ "_id" : { "$oid" : "..." } }, "updateDescription" : { "updatedFields" :
{ "cuisine" : "Irish" }, "removedFields" : [ ], "truncatedArrays" : [ ] } }

Tip

Para obtener más información sobre pre-imágenes y post-imágenes, consulta Change Streams con preimágenes y postimágenes de documentos en el manual de MongoDB Server.

Para saber más sobre las change streams, consulta Change Streams en el manual de MongoDB Server.

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: