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
/ /

Supervisar los cambios en los datos

En esta guía, puedes aprender cómo monitorear los cambios en los documentos utilizando un flujo de cambios.

Un flujo de cambios genera nuevos eventos de cambio, proporcionando acceso a cambios de datos en tiempo real. Puedes abrir un flujo de cambios en una colección, base de datos u objeto cliente.

Los ejemplos en esta guía utilizan lo siguiente Course struct como modelo para documentos en la colección courses:

type Course struct {
Title string
Enrollment int32
}

Para ejecutar los ejemplos de esta guía, cargue estos documentos en la colección courses de la base de datos db utilizando el siguiente snippet:

coll := client.Database("db").Collection("courses")
docs := []interface{}{
Course{Title: "World Fiction", Enrollment: 35},
Course{Title: "Abstract Algebra", Enrollment: 60},
}
result, err := coll.InsertMany(context.TODO(), docs)

Tip

Bases de datos y colecciones inexistentes

Si la base de datos y la colección necesarias no existen cuando realizas una operación de guardar, el servidor las crea implícitamente.

Cada documento contiene una descripción de una asignatura universitaria que incluye el título y la cantidad máxima de inscritos, correspondientes a los campos title y enrollment en cada documento.

Nota

Cada salida de ejemplo muestra valores truncados de _data, clusterTime y ObjectID porque el controlador los genera de manera única.

Para abrir un flujo de cambios, utiliza el método Watch(). El método Watch() requiere un parámetro de contexto y un parámetro de pipeline. Para devolver todos los cambios, pasa un objeto Pipeline vacío.

El siguiente ejemplo abre un flujo de cambios en la colección courses y muestra todos los cambios:

changeStream, err := coll.Watch(context.TODO(), mongo.Pipeline{})
if err != nil {
panic(err)
}
defer changeStream.Close(context.TODO())
// Iterates over the cursor to print the change stream events
for changeStream.Next(context.TODO()) {
fmt.Println(changeStream.Current)
}

Si modificas la colección courses en un programa o shell aparte, este código imprime tus cambios a medida que se producen. Insertar un documento con un valor title de "Advanced Screenwriting" y un valor de enrollment de 20 produce el siguiente evento de cambio:

map[_id:map[_data:...] clusterTime: {...} documentKey:map[_id:ObjectID("...")]
fullDocument:map[_id:ObjectID("...") enrollment:20 title:Advanced Screenwriting] ns:
map[coll:courses db:db] operationType:insert]

Utiliza el parámetro de pipeline para modificar la salida del flujo de cambios. Este parámetro te permite observar solo ciertos eventos de cambio. Da formato al parámetro de pipeline como un arreglo de documentos, donde cada documento representa una etapa de agregación.

Puedes utilizar las siguientes etapas de pipeline en este parámetro:

  • $addFields

  • $match

  • $project

  • $replaceRoot

  • $replaceWith

  • $redact

  • $set

  • $unset

El siguiente ejemplo abre un flujo de cambios en la base de datos db, pero solo observa nuevas operaciones de eliminación:

db := client.Database("db")
pipeline := bson.D{{"$match", bson.D{{"operationType", "delete"}}}}
changeStream, err := db.Watch(context.TODO(), mongo.Pipeline{pipeline})
if err != nil {
panic(err)
}
defer changeStream.Close(context.TODO())
// Iterates over the cursor to print the delete operation change events
for changeStream.Next(context.TODO()) {
fmt.Println(changeStream.Current)
}

Nota

Se llamó el método Watch() en la base de datos db, por lo tanto, el código genera nuevas operaciones de eliminación en cualquier colección dentro de esta base de datos.

Utiliza el parámetro options para modificar el comportamiento del método Watch().

Puedes especificar las siguientes opciones para el método Watch():

  • ResumeAfter

  • StartAfter

  • FullDocument

  • FullDocumentBeforeChange

  • BatchSize

  • MaxAwaitTime

  • Collation

  • StartAtOperationTime

  • Comment

  • ShowExpandedEvents

  • StartAtOperationTime

  • Custom

  • CustomPipeline

Para más información sobre estas opciones, visite el Manual de MongoDB Server.

Cuando realices cualquier operación CRUD en una colección, por defecto, el documento de evento de cambio correspondiente solo contiene el delta de los campos modificados por la operación. Puedes ver el documento completo antes y después de un cambio, además del delta, especificando la configuración en el parámetro options del método Watch().

Si desea ver la imagen posterior de un documento, la versión completa del documento después de un cambio, configure el campo FullDocument del parámetro options en uno de los siguientes valores:

  • UpdateLookup: El documento del evento de cambio incluye una copia de todo el documento modificado.

  • WhenAvailableEl documento de evento de cambio incluye una post-imagen del documento modificado para eventos de cambio si la post-imagen está disponible.

  • RequiredLa salida es la misma que para WhenAvailable, pero el controlador genera un error del lado del servidor si la imagen posterior no está disponible.

Si deseas ver la preimagen de un documento, la versión completa del documento antes de un cambio, configura el campo FullDocumentBeforeChange del parámetro options en uno de los siguientes valores:

  • WhenAvailableEl documento de evento de cambio incluye una preimagen del documento modificado para eventos de cambio si la preimagen está disponible.

  • Required: La salida es la misma que para WhenAvailable, pero el controlador genera un error del lado del servidor si la preimagen no está disponible.

Importante

Para acceder a las imágenes previas y posteriores de documentos, se debe habilitar changeStreamPreAndPostImages para la colección. Consulta el manual del servidor MongoDB para obtener instrucciones y más información.

Nota

No hay preimagen para un documento insertado ni postimagen para un documento eliminado.

El siguiente ejemplo llama al método Watch() en la colección courses. Especifica un valor para el campo FullDocument del parámetro options para generar una copia de todo el documento modificado, en lugar de solo los campos modificados:

opts := options.ChangeStream().SetFullDocument(options.UpdateLookup)
changeStream, err := coll.Watch(context.TODO(), mongo.Pipeline{}, opts)
if err != nil {
panic(err)
}
defer changeStream.Close(context.TODO())
for changeStream.Next(context.TODO()) {
fmt.Println(changeStream.Current)
}

Actualizar el valor de enrollment del documento con el title de "World Fiction" de 35 a 30 produce el siguiente evento de cambio:

{"_id": {"_data": "..."},"operationType": "update","clusterTime": {"$timestamp":
{"t":"...","i":"..."}},"fullDocument": {"_id":
{"$oid":"..."},"title": "World Fiction","enrollment":
{"$numberInt":"30"}}, "ns": {"db": "db","coll": "courses"},"documentKey": {"_id":
{"$oid":"..."}}, "updateDescription": {"updatedFields": {"enrollment": {"$numberInt":"30"}},
"removedFields": [],"truncatedArrays": []}}

Si no se especifica la opción FullDocument, la misma operación de actualización ya no mostrará el valor de "fullDocument" en el documento del evento de cambio.

Para ver un ejemplo ejecutable de un flujo de cambios, consulte Ejemplo para abrir un flujo de cambios.

Para más información sobre los Change Streams, consulta Change Streams.

Para aprender más sobre el método Watch(), consulte los siguientes enlaces de documentación de la API:

Volver

Texto de query

En esta página