Visão geral
Neste guia, você pode aprender como usar um fluxo de alterações para monitorar alterações em tempo real em seus dados. Um change stream é uma funcionalidade do MongoDB Server que permite que seu aplicação se inscreva em alterações de dados em uma collection, banco de dados de dados ou sistema.
Ao usar a biblioteca PHP do MongoDB , você pode chamar o método watch() para retornar uma instância de MongoDB\ChangeStream. Em seguida, você pode iterar por meio da instância MongoDB\ChangeStream para monitorar as alterações de dados, como atualizações, inserções e exclusões.
Dica
Atlas Stream Processing
Como uma alternativa para alterar fluxos, você pode utilizar o Atlas Stream Processing para processar e transformar fluxos de dados. Ao contrário dos change streams, que registram apenas eventos de banco de dados, o Atlas Stream Processing gerencia vários tipos de evento de dados e fornece funcionalidades estendidas de processamento de dados. Para saber mais sobre esse recurso, consulte Atlas Stream Processing na documentação do MongoDB Atlas.
Dados de amostra
Os exemplos neste guia usam a collection restaurants no banco de dados sample_restaurants dos conjuntos de banco de dados de amostra do Atlas. Para acessar essa coleção a partir do seu aplicação PHP , instancie um MongoDB\Client que se conecte a um Atlas cluster e atribua o seguinte valor à sua variável $collection :
$collection = $client->sample_restaurants->restaurants;
Dica
Para aprender como criar uma implantação gratuita do MongoDB e carregar os conjuntos de dados de amostra, consulte o Guia de introdução do MongoDB.
Alguns exemplos utilizam a função toJSON() para representar eventos de alteração, que são documentos BSON, como Extended JSON. Para usar essa função, cole o seguinte código no arquivo do seu aplicação :
function toJSON(object $document): string { return MongoDB\BSON\Document::fromPHP($document)->toRelaxedExtendedJSON(); }
Abrir um fluxo de alterações
Para abrir um fluxo de alteração, chame o método watch() . A instância na qual você chama o método watch() determina o escopo de eventos que o change stream monitora. Você pode chamar o método watch() em instâncias das seguintes classes:
MongoDB\Client: Monitorar todas as alterações na implantação do MongoDBMongoDB\Database: Monitorar alterações em todas as collections no banco de banco de dadosMongoDB\Collection: Monitorar alterações na coleção
O exemplo a seguir abre um fluxo de alteração na collection restaurants e gera as alterações conforme elas ocorrem:
$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 começar a observar as alterações, execute o código anterior. Em seguida, em uma shell separada, modifique a coleção restaurants . O exemplo a seguir atualiza um documento que tem um valor de campo name de 'Blarney Castle':
$result = $collection->updateOne( ['name' => 'Blarney Castle'], ['$set' => ['cuisine' => 'Irish']], );
Quando você atualiza a coleção, o aplicação de fluxo de alterações imprime a alteração conforme ela ocorre. O evento de alteração impresso se assemelha à seguinte saída:
{ "_id" : { "_data" : "..." }, "operationType" : "update", "clusterTime" : { "$timestamp" : { ... } }, "wallTime" : { "$date" : "..." }, "ns" : { "db" : "sample_restaurants", "coll" : "restaurants" }, "documentKey" : { "_id" : { "$oid" : "..." } }, "updateDescription" : { "updatedFields" : { "cuisine" : "Irish" }, "removedFields" : [ ], "truncatedArrays" : [ ] } }
Modificar a saída change stream
Para modificar a saída do change stream, passe os estágios de pipeline em uma array como parâmetro para o método watch() . Você pode incluir os seguintes estágios na array:
$addFieldsou$set: adiciona novos campos aos documentos$match: filtra os documentos$project: projeta um subconjunto dos campos do documento$replaceWithou$replaceRoot: substitui o documento de entrada pelo documento especificado$redact: restringe o conteúdo dos documentos$unset: remove campos de documentos
O exemplo a seguir passa um pipeline que inclui o estágio $match para o método watch() . Isso instrui o método watch() a gerar eventos somente quando as operações de atualização ocorrerem:
$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; } }
Dica
Operações com construtores
Você pode usar um padrão de construtor para criar o pipeline do fluxo de alterações. Para saber mais, consulte o guia Operações com construtores.
Modificar Comportamento do watch()
Para modificar o comportamento do método watch() , você pode passar uma array de opções como parâmetro para watch(). A tabela a seguir descreve opções úteis que você pode definir na array:
Opção | Descrição |
|---|---|
| Especifica se deve mostrar o documento completo após a alteração, em vez de mostrar apenas as alterações feitas no documento. Para aprender mais sobre esta opção, consulte a seção Incluir pré-imagens e pós-imagens deste guia. |
| Especifica se o documento completo deve ser mostrado como estava antes da alteração, em vez de mostrar apenas as alterações feitas no documento. Para saber mais sobre essa opção, consulte Incluir pré-imagens e pós-imagens. |
| Instrui o |
| Instrui o change stream a fornecer apenas alterações que ocorreram no momento ou após o registro de data e hora especificado. |
| Define o agrupamento a ser usado para o cursor do fluxo de alterações. Para aprender mais, consulte a seção Agrupamentos desta página. |
Para obter uma lista completa das opções watch() , consulte MongoDB\Collection::watch() na documentação da API.
Incluir pré-imagens e pós-imagens
Importante
Você pode habilitar pré-imagens e pós-imagens em collections somente se seu sistema usar MongoDB v6.0 ou posterior.
Por padrão, quando você executa uma operação em uma collection, o evento de alteração correspondente inclui somente o delta dos campos modificados por essa operação. Para ver o documento completo antes ou depois de uma alteração, especifique as opções fullDocumentBeforeChange ou fullDocument em um parâmetro de array para watch().
A pré-imagem é a versão completa de um documento antes de uma alteração. Para incluir a pré-imagem no evento de fluxo de alteração, defina a opção fullDocumentBeforeChange para um dos seguintes valores:
MongoDB\Operation\Watch::FULL_DOCUMENT_BEFORE_CHANGE_WHEN_AVAILABLE: o evento de alteração inclui uma pré-imagem do documento modificado para eventos de alteração. Se a pré-imagem não estiver disponível, esse campo de evento de alteração terá um valornull.MongoDB\Operation\Watch::FULL_DOCUMENT_BEFORE_CHANGE_REQUIRED: o evento de alteração inclui uma pré-imagem do documento modificado para eventos de alteração. Se a pré-imagem não estiver disponível, o servidor gerará um erro.
A pós-imagem é a versão completa de um documento após uma alteração. Para incluir a pós-imagem na alteração de evento de fluxo, defina a opção fullDocument para um dos seguintes valores:
MongoDB\Operation\Watch::FULL_DOCUMENT_UPDATE_LOOKUP: o evento de alteração inclui uma cópia de todo o documento alterado de algum tempo após a alteração.MongoDB\Operation\Watch::FULL_DOCUMENT_WHEN_AVAILABLE: o evento de alteração inclui uma pós-imagem do documento modificado para eventos de alteração. Se a pós-imagem não estiver disponível, esse campo de evento de alteração terá um valornull.MongoDB\Operation\Watch::FULL_DOCUMENT_REQUIRED: o evento de alteração inclui uma pós-imagem do documento modificado para eventos de alteração. Se a pós-imagem não estiver disponível, o servidor gerará um erro.
O exemplo a seguir chama o método watch() em uma coleção e inclui a pós-imagem de documentos atualizados definindo a opção 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; } }
Com o aplicação de fluxo de alterações em execução em um shell separado, atualizar um documento na coleção restaurants usando o exemplo de atualização anterior imprime um evento de alteração semelhante à seguinte saída:
{ "_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" : [ ] } }
Dica
Para saber mais sobre pré e pós-imagens, consulte Change Streams com pré e pós-imagens de documentos no manual do MongoDB Server .
Agrupamentos
Para especificar um agrupamento para sua operação, passe um parâmetro de array $options que defina a opção collation para o método de operação. Atribua a opção collation a uma array que configure as regras de agrupamento.
A tabela a seguir descreve os campos que você pode definir para configurar o agrupamento:
Campo | Descrição |
|---|---|
| (Obrigatório) Especifica a locale { components internacionais para Unicode} (ICU). Para obter uma lista de localidades suportadas, consulte Localidades de Agrupamento e Parâmetros Padrão no manual do MongoDB Server . |
| (Opcional) Especifica se incluir comparação de caso. |
| (Opcional) Especifica a ordem de classificação das diferenças de caso durante as comparações de nível terciário. |
| (Opcional) Especifica o nível de comparação a ser executado, conforme definido na documentação da ICU. |
| (Opcional) Especifica se o driver compara strings numéricas como números. |
| (Opcional) Especifica se a biblioteca considera espaços em branco e pontuação como caracteres base para fins de comparação. |
| (Opcional) Especifica quais caracteres a biblioteca considera ignoráveis quando o |
| (Opcional) Especifica se as strings contendo diacríticos são classificadas da parte de trás da string para a frente. |
Para saber mais sobre agrupamento e os possíveis valores para cada campo, consulte a entrada de Agrupamento no manual do MongoDB Server.
Informações adicionais
Para saber mais sobre fluxos de alterações, consulte Change Streams de alterações no manual do MongoDB Server .
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: