Overview
En esta guía, aprenderá a usar un flujo de cambios para supervisar los cambios en sus datos en tiempo real. Un flujo de cambios es una función de MongoDB Server que permite que su aplicación se suscriba a los cambios en los datos de una colección, base de datos o implementación.
Al utilizar el controlador Ruby, puede llamar al watch Método para devolver un objeto Mongo::Collection::View::ChangeStream. Luego, puede iterar sobre su contenido para monitorear cambios en los datos, como actualizaciones, inserciones y eliminaciones.
Datos de muestra
Los ejemplos de esta guía utilizan 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 Mongo::Client objeto que se conecte a un clúster de Atlas y asigne los siguientes valores a las variables database collection y:
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 muestra, consulte la guía de introducción a MongoDB.
Abre un flujo de cambios
Para abrir un flujo de cambios, llame al método watch. El objeto en el que llama al método watch determina el alcance de los eventos que supervisa el flujo de cambios. Puede llamar al método watch en los siguientes objetos:
Mongo::Client:Supervisa los cambios en todas las colecciones en todas las bases de datos de una implementación, excluyendo las colecciones del sistema o las colecciones en lasadminlocalconfigbases de datos, yMongo::Database:Monitorea los cambios en todas las colecciones en una base de datosMongo::Collection:Monitorea los cambios en una colección
El siguiente ejemplo abre un flujo de cambios en la colección restaurants y genera los cambios a medida que ocurren:
stream = collection.watch stream.each do |doc| puts doc break if doc['operationType'] == 'invalidate' end
Para empezar a observar los cambios, ejecute el código anterior. Luego, en un shell independiente, modifique la colección restaurants. El siguiente ejemplo actualiza un documento cuyo valor de campo name es 'Blarney Castle':
collection.update_one( { 'name' => 'Blarney Castle' }, { '$set' => { 'cuisine' => 'Irish' } } )
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"=>{"_data"=>"..."}, "operationType"=>"update", "clusterTime"=>#<...>, "ns"=>{"db"=>"sample_restaurants", "coll"=>"restaurants"}, "documentKey"=> {"_id"=>BSON::ObjectId('...')}, "updateDescription"=>{"updatedFields"=> {"cuisine"=>"Irish"}, "removedFields"=>[], "truncatedArrays"=>[]}}
Modificar la salida del flujo de cambios
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:
$addFieldso$set: Agrega nuevos campos a los documentos$match:Filtra los documentos$project: Proyecta un subconjunto de los campos del documento$replaceWitho$replaceRoot: reemplaza el documento de entrada con el documento especificado$redact:Restringe el contenido de los documentos$unset:Elimina campos de los documentos
El siguiente ejemplo pasa una canalización que incluye la etapa $match al método watch. Esto indica al método watch que genere eventos solo cuando se realizan operaciones de actualización:
pipeline = [{ '$match' => { 'operationType' => 'update' } }] stream = collection.watch(pipeline) stream.each do |doc| puts doc break if doc['operationType'] == 'invalidate' end
Modificar el comportamiento del reloj
Para modificar el comportamiento del método watch, puede pasar un hash de opciones como parámetro a watch. La siguiente tabla describe algunas de las opciones que puede configurar:
Opción | 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 the Include Pre-Images and Post-Images section of this
guide. |
| 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. |
| Specifies the logical starting point for the change stream. This option is mutually exclusive with 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. |
| Sets the collation to use for the change stream cursor. |
Para obtener una lista completa de las watch opciones,consulte watch en la documentación de la API.
Incluir imágenes previas y posteriores
Importante
Puede habilitar imágenes previas y posteriores en colecciones solo si su implementación usa MongoDB v6.0 o posterior.
De forma predeterminada, cuando se realiza una operación en una colección, el evento de cambio correspondiente incluye solo los campos modificados y sus valores antes y después de la operación.
Puede indicar al método que devuelva watch la preimagen del documento, 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, pase un hash de opciones a watch que establezca la full_document_before_change opción. Puede establecer esta opción con los siguientes valores de cadena:
'whenAvailable'El evento de cambio incluye una preimagen del documento modificado para eventos de cambio. Si la preimagen no está disponible, este campo de evento de cambio tiene un valornil.'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':(Predeterminado) El evento de cambio no incluye una imagen previa del documento modificado.
También puede watch indicar al método que devuelva la imagen posterior del documento, la versión completa del documento después de los cambios, además de los campos modificados. Para incluir la imagen posterior en el evento de flujo de cambios, pase un hash de opciones a watch que establezca la full_document opción. Puede establecer esta opción con los siguientes valores de cadena:
'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. Si la imagen posterior no está disponible, este campo de evento de cambio tiene un valornil.'required'El evento de cambio incluye una imagen posterior del documento modificado. Si la imagen posterior no está disponible, el servidor genera un error.'default':(Predeterminado) El evento de cambio no incluye una imagen posterior del documento modificado.
El siguiente ejemplo llama al método watch en una colección e incluye la imagen posterior de los documentos actualizados configurando 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, actualizar un documento en la restaurants colección mediante el ejemplo de actualización anterior imprime un evento de cambio similar 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 imágenes previas y posteriores, consulte Flujos de cambio con imágenes previas y posteriores de documentos en el manual de MongoDB Server.
Información Adicional
Para obtener más información sobre los flujos de cambio, consulte Flujos de cambio 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: