Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Supervise los datos con Change Streams

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.

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();
}

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 MongoDB

  • MongoDB\DatabaseSupervisar los cambios en todas las colecciones de la base de datos

  • MongoDB\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" : [ ] } }

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']]];
$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.

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

fullDocument

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.

fullDocumentBeforeChange

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.

startAfter

Indica a watch() que inicie una nueva secuencia de cambios tras la operación especificada en el token de reanudación. Este campo permite que las notificaciones se reanuden tras un evento de invalidación.
Cada documento de evento de secuencia de cambios incluye un token de reanudación como _id campo. Pase el _id campo completo del documento de evento de cambio que representa la operación que desea reanudar.
Esta opción es mutuamente excluyente con resumeAfter startAtOperationTimey.

startAtOperationTime

Indica al flujo de cambios que solo proporcione los cambios que ocurrieron en o después de la marca de tiempo especificada.
Esta opción es mutuamente excluyente con startAfter y.resumeAfter

collation

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.

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 de null.

  • 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 de null.

  • 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.

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

locale

(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.

Tipo de datos: string

caseLevel

(Opcional) Especifica si se debe incluir la comparación de mayúsculas y minúsculas.

Cuando se establece true en, el comportamiento de la comparación depende del valor del strength campo:

- Si strength 1es, la biblioteca PHP compara
caracteres base y mayúsculas y minúsculas.

- Si strength 2es, la biblioteca PHP compara
caracteres base, diacríticos, otras diferencias secundarias y mayúsculas y minúsculas.

- Si strength es cualquier otro valor, este campo se ignora.

Cuando se establece false en, la biblioteca PHP no incluye la comparación de mayúsculas y minúsculas en el nivel 1 de fuerza 2 o.

Tipo de datos: bool
Predeterminado: false

caseFirst

(Opcional) Especifica el orden de clasificación de las diferencias entre casos durante las comparaciones de nivel terciario.

Tipo de datos: string
Valor predeterminado: "off"

strength

(Opcional) Especifica el nivel de comparación a realizar, tal como se define en la documentación de la UCI.

Tipo de datos: int
Valor predeterminado: 3

numericOrdering

(Opcional) Especifica si el driver compara las strings numéricas como números.

Si se establece en true, la librería PHP compara las strings numéricas como números. Por ejemplo, al comparar las strings "10" y "2", la librería utiliza los valores numéricos de las strings y trata "10" como mayor que "2".

Si se establece en false, la librería PHP compara las strings numéricas como strings. Por ejemplo, al comparar las strings "10" y "2", la librería compara un carácter a la vez y trata "10" como menor que "2".

Para obtener más información, consulte Restricciones de intercalación en el manual de MongoDB Server.

Tipo de dato: bool
Por defecto: false

alternate

(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.

Tipo de dato: string
Por defecto: "non-ignorable"

maxVariable

(Opcional) Especifica qué caracteres considera la biblioteca ignorables cuando el alternate campo se establece "shifted" en.

Tipo de datos: string
Valor predeterminado: "punct"

backwards

(Opcional) Especifica si las cadenas que contienen diacríticos se ordenan desde el final de la cadena hacia el principio.

Tipo de datos: bool
Valor predeterminado: false

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.

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: