Visão geral
Neste guia, você pode aprender como usar um fluxo de alterações para monitorar alterações em tempo real em seu banco de dados. Um change stream é um recurso do MongoDB Server que permite que seu aplicativo se inscreva em alterações de dados em uma collection, banco de dados ou sistema.
Ao utilizar o driver C++ , você pode instanciar um mongocxx::change_stream para monitorar alterações de dados.
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 C++ , instancie um mongocxx::client que se conecte a um Atlas cluster e atribua os seguintes valores às suas variáveis db e collection :
auto db = client["sample_restaurants"]; auto collection = db["restaurants"];
Para aprender a criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o Guia de Introdução do MongoDB.
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 escuta. Você pode chamar o método watch() nas seguintes classes:
mongocxx::client: Monitorar todas as alterações na implantação do MongoDBmongocxx::database: Monitorar alterações em todas as collections no banco de banco de dadosmongocxx::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:
auto stream = collection.watch(); while (true) { for (const auto& event : stream) { std::cout << bsoncxx::to_json(event) << std::endl; } }
Para começar a observar as alterações, execute o código anterior. Em seguida, em um aplicação ou shell separado, modifique a coleção restaurants . O exemplo a seguir atualiza um documento que tem um valor de campo name de Blarney Castle:
auto result = collection.update_one(make_document(kvp("name", "Blarney Castle")), make_document(kvp("$set", make_document(kvp("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
Você pode passar uma instância mongocxx::pipeline como argumento para o método watch() para modificar a saída do fluxo de alteração. A lista a seguir inclui alguns dos campos mongocxx::pipeline que você pode definir chamando seus métodos de configuração correspondentes:
add_fields: adiciona novos campos aos documentosmatch: filtra os documentosproject: projeta um subconjunto dos campos do documentoredact: restringe o conteúdo dos documentosgroup: Agrupa documentos por uma expressão especificadamerge: gera os resultados para uma coleção
Dica
Para obter uma lista completa dos campos mongocxx::pipeline, consulte a documentação da API mongocxx::pipeline.
O exemplo a seguir define o campo match de uma instância mongocxx::pipeline e, em seguida, passa o pipeline para o método watch() . Isso instrui o método watch() a gerar somente operações de atualização:
mongocxx::pipeline pipeline; pipeline.match(make_document(kvp("operationType", "update"))); auto stream = collection.watch(pipeline); while (true) { for (const auto& event : stream) { std::cout << bsoncxx::to_json(event) << std::endl; } }
Modificar Comportamento do watch()
Você pode modificar o comportamento do método watch() passando uma instância da classe mongocxx::options::change_stream como parâmetro. A tabela seguinte descreve os campos que você pode definir em uma instância do mongocxx::options::find :
Campo | Descrição |
|---|---|
| Especifica se o documento completo deve ser mostrado após a 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. |
| 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 |
| Instrui o |
| Instrui |
| Define a quantidade máxima de tempo, em milissegundos, o servidor aguarda novas alterações de dados para relatar ao cursor do fluxo de alterações antes de retornar um lote vazio. Padrão para 1000 milissegundos. |
| Define o número máximo de eventos de alteração a serem retornados em cada lote da resposta do cluster MongoDB . |
| Define o agrupamento a ser usado para o cursor do change stream. |
| Anexa um comentário à operação. |
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 os campos full_document_before_change ou full_document de uma instância do mongocxx::options::change_stream .
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 o campo full_document_before_change para uma das seguintes strings:
"whenAvailable": o evento de alteração inclui uma pré-imagem do documento modificado para eventos de alteração somente se a pré-imagem estiver disponível."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 driver 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 no evento de fluxo de alteração, defina o campo full_document para uma das seguintes strings:
"updateLookup": o evento de alteração inclui uma cópia de todo o documento alterado de algum tempo após a alteração."whenAvailable": O evento de alteração inclui uma pós-imagem do documento modificado para eventos de alteração somente se a pós-imagem estiver disponível."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 driver 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 o campo full_document de uma instância mongocxx::options::change_stream :
mongocxx::options::change_stream opts; opts.full_document("updateLookup"); auto stream = collection.watch(opts); while (true) { for (const auto& event : stream) { std::cout << bsoncxx::to_json(event) << std::endl; } }
Com o aplicação change stream em execução, atualizar um documento na collection restaurants usando o exemplo de atualização anterior imprime um evento de alteração semelhante ao código a seguir:
{ "_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 .
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: