Overview
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.
Cuando utilices el controlador de C++, puedes instanciar un mongocxx::change_stream para monitorear los cambios de datos.
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.
Abre un flujo de cambios
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 MongoDBmongocxx::database:Monitorear los cambios en todas las colecciones de la base de datosmongocxx::collectionSupervise los cambios en la colección
El siguiente ejemplo abre un flujo de cambios en la colección restaurants y genera 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" : [ ] } }
Modificar la salida del flujo de cambios
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 documentosmatchFiltra los documentosproject: Proyecta un subconjunto de los campos del documentoredact:Restringe el contenido de los documentosgroup: Agrupa documentos por una expresión especificadamerge: Emite los resultados a una colección
Tip
Para obtener una lista completa de los mongocxx::pipeline campos, consulte 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; } }
Modificar el comportamiento de watch()
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 puede configurar en una instancia mongocxx::options::change_stream:
Campo | Descripción |
|---|---|
| Specifies whether to show the full document after the change, rather
than showing only the changes made to the document. To learn more about
this option, see Include Pre-Images and Post-Images. |
| Specifies whether to show the full document as it was before the change, rather
than showing only the changes made to the document. To learn more about
this option, see Include Pre-Images and Post-Images. |
| Instructs watch() to resume returning changes after the
operation specified in the resume token.Each change stream event document includes a resume token as the _id
field. Pass the entire _id field of the change event document that
represents the operation you want to resume after.resume_after is mutually exclusive with start_after and start_at_operation_time. |
| Instructs watch() to start a new change stream after the
operation specified in the resume token. This field allows notifications to
resume after an invalidate event.Each change stream event document includes a resume token as the _id
field. Pass the entire _id field of the change event document that
represents the operation you want to resume after.start_after is mutually exclusive with resume_after and start_at_operation_time. |
| Instructs watch() to return only events that occur after the
specified timestamp.start_at_operation_time is mutually exclusive with resume_after and start_after. |
| Sets the maximum amount of time, in milliseconds, the server waits for new
data changes to report to the change stream cursor before returning an
empty batch. Defaults to 1000 milliseconds. |
| Sets the maximum number of change events to return in each batch of the
response from the MongoDB cluster. |
| Sets the collation to use for the change stream cursor. |
| Attaches a comment to the operation. |
Incluir imágenes preoperativas y postoperatorias
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, configure el full_document_before_change campo con una de las siguientes cadenas:
"whenAvailable":El evento de cambio incluye una imagen previa del documento modificado para eventos de cambio solo si la imagen previa 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 de flujo de cambios en ejecución, actualizar un documento en la restaurants colección mediante el ejemplo de actualización anterior imprime un evento de cambio similar 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.
Información Adicional
Para saber más sobre las change streams, consulta Change Streams en el manual de MongoDB Server.
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: