Overview
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 la MongoDB PHP librería, se puede llamar al método watch() para devolver una instancia de MongoDB\ChangeStream. Luego, puedes iterar a través de la instancia de MongoDB\ChangeStream para supervisar los cambios de datos, como actualizaciones, inserciones y eliminaciones.
Tip
Atlas Stream Processing
Como alternativa a los flujos de cambios, puedes usar Atlas Stream Processing para procesar y transformar flujos de datos. A diferencia de los flujos de cambios, que solo registran eventos de base de datos, Atlas Stream Processing administra múltiples tipos de eventos de datos y ofrece capacidades avanzadas de procesamiento de datos. Para obtener más información sobre esta funcionalidad, consulta Atlas Stream Processing en la documentación de MongoDB Atlas.
Datos de muestra
Los ejemplos de esta guía utilizan la colección restaurants en la base de datos sample_restaurants de los conjuntos de datos de muestra de Atlas. Para acceder a esta colección desde tu aplicación PHP, instancia un MongoDB\Client que se conecte a un clúster Atlas y asigna el siguiente valor a tu variable $collection:
$collection = $client->sample_restaurants->restaurants;
Tip
Para saber cómo crear una implementación gratuita de MongoDB y cargar los conjuntos de datos de ejemplo, consulta la guía MongoDB Primeros Pasos.
Algunos ejemplos utilizan la función toJSON() para representar eventos de cambio, que son documentos BSON, como Extended JSON. Para usar esta función, pegue el siguiente código en su archivo de aplicación:
function toJSON(object $document): string { return MongoDB\BSON\Document::fromPHP($document)->toRelaxedExtendedJSON(); }
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 que el flujo de cambios supervisa. Puedes llamar al método watch() en instancias de las siguientes clases:
MongoDB\Client: Supervisa todos los cambios en la implementación de MongoDBMongoDB\DatabaseSupervisar los cambios en todas las colecciones de la base de datosMongoDB\CollectionSupervise los cambios en la colección
El siguiente ejemplo abre un flujo de cambios en la colección restaurants y muestra los cambios a medida que ocurren:
$changeStream = $collection->watch(); $changeStream->rewind(); while (true) { $changeStream->next(); if ($changeStream->valid()) { continue; } $event = $changeStream->current(); echo toJSON($event), PHP_EOL; if ($changeStream->current()['operationType'] === 'invalidate') { break; } }
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':
$result = $collection->updateOne( ['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" : { "$timestamp" : { ... } }, "wallTime" : { "$date" : "..." }, "ns" : { "db" : "sample_restaurants", "coll" : "restaurants" }, "documentKey" : { "_id" : { "$oid" : "..." } }, "updateDescription" : { "updatedFields" : { "cuisine" : "Irish" }, "removedFields" : [ ], "truncatedArrays" : [ ] } }
Modificar la Salida del Cambio de Flujo
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$matchFiltra los documentos$project: Proyecta un subconjunto de los campos del documento$replaceWitho$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']]]; $changeStream = $collection->watch($pipeline); $changeStream->rewind(); while (true) { $changeStream->next(); if ($changeStream->valid()) { continue; } $event = $changeStream->current(); echo toJSON($event), PHP_EOL; if ($changeStream->current()['operationType'] === 'invalidate') { break; } }
Tip
Operaciones con desarrolladores
Puedes utilizar un patrón Builder para crear el flujo de cambios del pipeline. Para obtener más información, consulta la guía Operaciones con desarrolladores.
Modificar el comportamiento de watch()
Para modificar el comportamiento del método watch(), puedes pasar un arreglo de opciones como parámetro a watch(). La siguiente tabla describe las opciones útiles que puedes establecer en el arreglo:
Opción | Descripción |
|---|---|
| Especifica si se debe mostrar el documento completo después del cambio, en lugar de mostrar solo los cambios realizados en el documento. Para obtener más información sobre esta opción, consulte la sección Incluir preimágenes y posimágenes de esta guía. |
| Especifica si se debe mostrar el documento completo tal como estaba antes del cambio, en lugar de mostrar solo las modificaciones realizadas en el documento. Para obtener más información sobre esta opción, consulte Incluir imágenes previas y posteriores. |
| Indica a |
| Indica al flujo de cambios que solo proporcione los cambios que ocurrieron en o después de la marca de tiempo especificada. |
| Establece la intercalación que se utilizará para el cursor del flujo de cambios. Para aprender más, consulte la sección Intercalación de esta página. |
Para obtener una lista completa de las watch() opciones, consulta MongoDB\Collection::watch() en la documentación de la API.
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.
De forma predeterminada, cuando realizas una operación en una colección, el evento de cambio correspondiente solo incluye el delta de los campos modificados por esa operación. Para ver el documento completo antes o después de un cambio, especifica las opciones fullDocumentBeforeChange o fullDocument en un parámetro de arreglo para watch().
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, se debe establecer la opción fullDocumentBeforeChange en uno de los siguientes valores:
MongoDB\Operation\Watch::FULL_DOCUMENT_BEFORE_CHANGE_WHEN_AVAILABLEEl 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 denull.MongoDB\Operation\Watch::FULL_DOCUMENT_BEFORE_CHANGE_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.
La post-imagen es la versión completa de un documento después de un cambio. Para incluir la post-imagen en el evento del flujo de cambios, configure la opción fullDocument en uno de los siguientes valores:
MongoDB\Operation\Watch::FULL_DOCUMENT_UPDATE_LOOKUP: El evento de cambio incluye una copia de todo el documento cambiado a partir de cierto tiempo después del cambio.MongoDB\Operation\Watch::FULL_DOCUMENT_WHEN_AVAILABLEEl 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 denull.MongoDB\Operation\Watch::FULL_DOCUMENT_REQUIREDEl 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.
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 fullDocument:
$options = ['fullDocument' => MongoDB\Operation\Watch::FULL_DOCUMENT_UPDATE_LOOKUP]; $changeStream = $collection->watch([], $options); $changeStream->rewind(); while (true) { $changeStream->next(); if ($changeStream->valid()) { continue; } $event = $changeStream->current(); echo toJSON($event), PHP_EOL; if ($changeStream->current()['operationType'] === 'invalidate') { break; } }
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" : { "$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.
Intercalación
Para especificar una intercalación para tu operación, pasa un parámetro arreglo $options que establezca la opción collation en el método de la operación. Asigna la opción collation a un arreglo que configure las reglas de intercalación.
La siguiente tabla describe los campos que se pueden configurar para la intercalación:
Campo | Descripción |
|---|---|
| (Obligatorio) Especifica la configuración regional de Componentes Internacionales para Unicode (ICU). Para obtener una lista de las configuraciones regionales compatibles, consulte Configuraciones regionales de intercalación y parámetros predeterminados en el manual del servidor MongoDB. |
| (Opcional) Especifica si se debe incluir la comparación de mayúsculas y minúsculas. |
| (Opcional) Especifica el orden de clasificación de las diferencias entre casos durante las comparaciones de nivel terciario. |
| (Opcional) Especifica el nivel de comparación a realizar, tal como se define en la documentación de la UCI. |
| (Opcional) Especifica si el driver compara las strings numéricas como números. |
| (Opcional) Especifica si la librería considera los espacios en blanco y la puntuación como caracteres base a los efectos de la comparación. |
| (Opcional) Especifica qué caracteres considera la biblioteca ignorables cuando el |
| (Opcional) Especifica si las cadenas que contienen diacríticos se ordenan desde el final de la cadena hacia el principio. |
Para obtener más información sobre la intercalación y los posibles valores de cada campo, consulta la entrada Collation en el manual del servidor de MongoDB.
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: