Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Supervisar los cambios en los datos

En esta guía, puedes aprender a usar un flujo de cambios para supervisar los cambios en tiempo real de tus 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 se utiliza el controlador Ruby, se puede llamar al watch método para devolver un objeto Mongo::Collection::View::ChangeStream. Luego, puedes iterar a través de su contenido para supervisar los cambios de datos, como actualizaciones, inserciones y eliminaciones.

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 Ruby, cree un objeto Mongo::Client que se conecte a un clúster Atlas y asigne los siguientes valores a las variables database y collection:

database = client.use('sample_restaurants')
collection = database[: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. El objeto en el que se llama al método watch determina el alcance de los eventos que el flujo de cambios supervisa. Puedes llamar al método watch en los siguientes objetos

  • Mongo::ClientMonitorea los cambios en todas las colecciones de todas las bases de datos de una implementación, excluyendo colecciones del sistema o colecciones en las bases de datos admin, local y config

  • Mongo::Database: Supervisa los cambios en todas las colecciones de una base de datos

  • Mongo::Collection: Supervisa los cambios en una colección

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

stream = collection.watch
stream.each do |doc|
puts doc
break if doc['operationType'] == 'invalidate'
end

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

collection.update_one(
{ 'name' => 'Blarney Castle' },
{ '$set' => { '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"=>#<...>,
"ns"=>{"db"=>"sample_restaurants", "coll"=>"restaurants"}, "documentKey"=>
{"_id"=>BSON::ObjectId('...')}, "updateDescription"=>{"updatedFields"=>
{"cuisine"=>"Irish"}, "removedFields"=>[], "truncatedArrays"=>[]}}

Para modificar la salida del flujo de cambios, puede pasar etapas de pipeline en un arreglo como parámetro al método watch. Puedes incluir las siguientes etapas en el arreglo:

  • $addFields o $set: Agrega nuevos campos a los documentos

  • $matchFiltra los documentos

  • $project: Proyecta un subconjunto de los campos del documento

  • $replaceWith o $replaceRoot: Reemplaza el documento de entrada por el documento especificado

  • $redact: Restringe los contenidos de los documentos

  • $unsetRemueve campos de documentos

El siguiente ejemplo pasa un pipeline que incluye la etapa $match al método watch. Esto le indica al método watch que devuelva eventos solo cuando ocurran operaciones de actualización:

pipeline = [{ '$match' => { 'operationType' => 'update' } }]
stream = collection.watch(pipeline)
stream.each do |doc|
puts doc
break if doc['operationType'] == 'invalidate'
end

Para modificar el comportamiento del método watch, puedes pasar un hash de opciones como parámetro a watch. La siguiente tabla describe algunas de las opciones que puedes configurar:

Opción
Descripción

full_document

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 the Include Pre-Images and Post-Images section of this guide.

full_document_before_change

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.

resume_after

Specifies the logical starting point for the change stream.
This option is mutually exclusive with start_at_operation_time.

start_at_operation_time

Instructs the change stream to only provide changes that occurred at or after the specified timestamp.
This option is mutually exclusive with resume_after.

collation

Sets the collation to use for the change stream cursor.

Para ver la lista completa de opciones de watch, consulta la watch en la documentación de la API.

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, al ejecutar una operación en una colección, el evento de cambio correspondiente solo incluye los campos modificados y sus valores antes y después de la operación.

Puedes indicar a watch que devuelva la pre-imagen del documento, es decir, la versión completa del documento antes de los cambios, además de los campos modificados. Para incluir la preimagen en el evento de flujo de cambios, pasa un hash de opciones a watch que establezca la opción full_document_before_change. Puede establecer esta opción con los siguientes valores de string:

  • 'whenAvailable'El evento de cambio incluye una preimagen del documento modificado para los eventos de cambio. Si la imagen previa no está disponible, este campo de evento de cambio tiene un valor de nil.

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

  • 'off': (Por defecto) El evento de cambio no incluye una preimagen del documento modificado.

También puedes indicar al método watch que devuelva la imagen posterior del documento, que es la versión completa del documento después de los cambios, además de los campos modificados. Para incluir la imagen de publicación en el evento de flujo de cambios, pasa un hash de opciones a watch que establezca la opción full_document. Puedes establecer esta opción a los siguientes valores de string:

  • '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 imagen posterior del documentos modificado para eventos de cambio. Si la imagen posterior no está disponible, este campo de evento de cambio tiene un valor de nil.

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

  • 'default': (Por defecto) El evento de cambio no incluye una post-imagen del documento modificado.

El siguiente ejemplo llama al método watch en una colección e incluye la publicación de imagen de los documentos actualizados estableciendo la opción full_document:

options = { full_document: 'updateLookup' }
stream = collection.watch([], options)
stream.each do |doc|
puts doc
break if doc['operationType'] == 'invalidate'
end

Con la aplicación de flujo de cambios ejecutándose en un shell separado, al actualizar un documento en la colección restaurants usando el ejemplo de actualización anterior, se imprime un evento de cambio que se asemeja a la siguiente salida:

{"_id"=>{"_data"=>"..."}, "operationType"=>"update", "clusterTime"=>
#<...1>, "wallTime"=>..., "fullDocument"=>{"_id"=>BSON::ObjectId('...'),
"address"=>{"building"=>"202-24", "coord"=>[-73.9250442, 40.5595462],
"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"=>BSON::ObjectId('...')}, "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:

Volver

Registro

En esta página