Docs Menu
Docs Home
/ /

Supervisar los cambios en los datos

En esta guía, aprenderá a usar el controlador C para supervisar un flujo de cambios, lo que le permitirá ver los cambios en sus datos en tiempo real. Un flujo de cambios es una función de MongoDB Server que publica los cambios en los datos de una colección, base de datos o implementación. Su aplicación puede suscribirse a un flujo de cambios y usar eventos para realizar otras acciones.

Los ejemplos de esta guía utilizan el restaurants colección en la base de datos sample_restaurants de la Conjuntos de datos de ejemplo de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de ejemplo, consulte la guía de introducción a MongoDB.

Para abrir un flujo de cambios, llame a una de las siguientes funciones que corresponda al alcance de los eventos que desea observar:

  • mongoc_client_watch():Monitorea todos los cambios en la implementación de MongoDB

  • mongoc_database_watch():Monitorea los cambios en todas las colecciones de la base de datos

  • mongoc_collection_watch():Monitorea los cambios en la colección

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

bson_t *pipeline = bson_new();
const bson_t *doc;
mongoc_change_stream_t *change_stream =
mongoc_collection_watch(collection, pipeline, NULL);
while (true) {
bson_error_t error;
if (mongoc_change_stream_next(change_stream, &doc)) {
char *str = bson_as_canonical_extended_json(doc, NULL);
printf("Received change: %s\n", str);
bson_free(str);
} else if (mongoc_change_stream_error_document(change_stream, &error, NULL)) {
printf("Got error on change stream: %s\n", error.message);
break;
}
}
bson_destroy(pipeline);
mongoc_change_stream_destroy(change_stream);

Para empezar a observar los cambios, ejecute la aplicación. A continuación, en una aplicación o shell independiente, realice una operación de escritura en la colección restaurants. El siguiente ejemplo actualiza un documento cuyo valor del campo name es "Blarney Castle":

bson_t *filter = BCON_NEW("name", BCON_UTF8("Blarney Castle"));
bson_t *update = BCON_NEW("$set", "{", "cuisine", BCON_UTF8("Irish"), "}");
mongoc_collection_update_one(collection, filter, update, NULL, NULL, NULL);

Al actualizar la colección, la aplicación de flujo de cambios imprime el cambio a medida que se produce. El evento de cambio impreso se parece al siguiente:

{
"_id": { ... },
"operationType": "update",
"clusterTime": { ... },
"ns": {
"db": "sample_restaurants",
"coll": "restaurants"
},
"updateDescription": {
"updatedFields": {
"cuisine": "Irish"
},
"removedFields": [],
"truncatedArrays": []
}
...
}

Puede pasar el parámetro pipeline a cualquier función de vigilancia para modificar la salida del flujo de cambios. Este parámetro le permite vigilar únicamente los eventos de cambio especificados. Formatee el parámetro como una lista de objetos, donde cada objeto representa una etapa de agregación.

Puede especificar las siguientes etapas en el parámetro pipeline:

  • $addFields

  • $match

  • $project

  • $replaceRoot

  • $replaceWith

  • $redact

  • $set

  • $unset

El siguiente ejemplo utiliza el parámetro pipeline para incluir una etapa $match para abrir un flujo de cambios que registra solo operaciones de actualización:

bson_t *pipeline = BCON_NEW(
"pipeline", "[",
"{", "$match", "{", "operationType", BCON_UTF8("update"), "}", "}",
"]");
const bson_t *doc;
mongoc_change_stream_t *change_stream =
mongoc_collection_watch(collection, pipeline, NULL);
while (mongoc_change_stream_next(change_stream, &doc)) {
char *str = bson_as_canonical_extended_json(doc, NULL);
printf("Received change: %s\n", str);
bson_free(str);
}
bson_destroy(pipeline);
mongoc_change_stream_destroy(change_stream);

Para obtener más información sobre cómo modificar la salida de su flujo de cambios, consulte la sección Modificar la salida del flujo de cambios en el manual de MongoDB Server.

Puede modificar cualquier función de vigilancia pasando opciones a la llamada de función. Si no especifica ninguna opción, el controlador no personaliza la operación.

La siguiente tabla describe las opciones que puede utilizar para personalizar el comportamiento de las funciones del reloj:

Opción
Descripción

batchSize

The maximum number of documents that a change stream can return in each batch, which applies to the watch function. By default, watch functions have an initial batch size of 101 documents and a maximum size of 16 mebibytes (MiB) for each subsequent batch. This option can enforce a smaller limit than 16 MiB, but not a larger one. For details, see Cursor Batches in the MongoDB Server manual.

comment

Specifies a comment to attach to the operation.

fullDocument

Sets the fullDocument value. To learn more, see the Include Pre-Images and Post-Images section of this document.

fullDocumentBeforeChange

Sets the fullDocumentBeforeChange value. To learn more, see the Include Pre-Images and Post-Images section of this document.

maxAwaitTimeMS

Sets the maximum await execution time on the server for this operation, in milliseconds.

Para obtener una lista completa de las opciones que puede utilizar para configurar la operación de vigilancia, consulte la guía del método de vigilancia en el manual de MongoDB Server.

Importante

Puede habilitar imágenes previas y posteriores en colecciones solo si su implementación usa MongoDB v6.0 o posterior.

De forma predeterminada, al realizar una operación en una colección, el evento de cambio correspondiente incluye solo la delta de los campos modificados por dicha operación. Para ver el documento completo antes o después de un cambio, especifique las opciones fullDocumentBeforeChange o fullDocument en la llamada a la función de vigilancia.

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, pase uno de los siguientes valores a la fullDocumentBeforeChange opción:

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

  • requiredEl evento de cambio incluye una preimagen del documento modificado para eventos de cambio. Si la preimagen no está disponible, el controlador genera un error.

La imagen posterior es la versión completa de un documento después de un cambio. Para incluirla en el evento de flujo de cambios, pase uno de los siguientes valores a la fullDocument opción:

  • updateLookup:El evento de cambio incluye una copia de todo el documento modificado desde algún tiempo después del cambio.

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

  • requiredEl evento de cambio incluye una imagen posterior del documento modificado. Si la imagen posterior no está disponible, el controlador genera un error.

El siguiente ejemplo llama a la función mongoc_collection_watch() en una colección e incluye la imagen posterior de los documentos actualizados en los resultados especificando la opción fullDocument:

bson_t *pipeline = bson_new();
bson_t *opts = BCON_NEW("fullDocument", BCON_UTF8("updateLookup"));
const bson_t *doc;
mongoc_change_stream_t *change_stream =
mongoc_collection_watch(collection, pipeline, opts);
while (true) {
bson_error_t error;
if (mongoc_change_stream_next(change_stream, &doc)) {
char *str = bson_as_canonical_extended_json(doc, NULL);
printf("Received change: %s\n", str);
bson_free(str);
} else if (mongoc_change_stream_error_document(change_stream, &error, NULL)) {
printf("Got error on change stream: %s\n", error.message);
break;
}
}
bson_destroy(pipeline);
bson_destroy(opts);
mongoc_change_stream_destroy(change_stream);

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:

{
"_id": ...,
"operationType": "update",
"clusterTime": ...,
"wallTime": ...,
"fullDocument": {
"_id": {
...
},
"address": ...,
"borough": "Queens",
"cuisine": "Irish",
"grades": [ ... ],
"name": "Blarney Castle",
"restaurant_id": ...
},
"ns": {
"db": "sample_restaurants",
"coll": "restaurants"
},
"documentKey": {
"_id": ...
},
"updateDescription": {
"updatedFields": {
"cuisine": "Irish"
},
"removedFields": [],
"truncatedArrays": []
}
}

Para obtener más información sobre imágenes previas y posteriores, consulte Flujos de cambio con imágenes previas y posteriores de documentos en el manual de MongoDB Server.

Para obtener más información sobre los flujos de cambio, consulte Flujos de cambio en el manual de MongoDB Server.

Para obtener más información sobre cualquiera de las funciones o tipos analizados en esta guía, consulte la siguiente documentación de API:

Volver

Monitoring

En esta página