Monitorar alterações de dados
Nesta página
Visão geral
Neste guia, você pode aprender a usar o driver C para monitorar um change stream, o que permite visualizar as alterações em tempo real nos seus dados. Um change stream é uma funcionalidade do MongoDB Server que publica alterações de dados em uma collection, banco de dados de dados ou sistema. Seu aplicação pode se inscrever em um change stream e usar eventos para executar outras ações.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants
no banco de dados de dados do sample_restaurants
a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .
Abrir um fluxo de alterações
Para abrir um change stream, chame uma das seguintes funções que corresponde ao escopo de eventos que você deseja observar:
mongoc_client_watch()
: Monitora todas as alterações na implantação do MongoDBmongoc_database_watch()
: Monitora alterações em todas as coleções no banco de banco de dadosmongoc_collection_watch()
: monitora alterações na coleção
Abrir um exemplo de change stream
O exemplo a seguir abre um fluxo de alteração na collection restaurants
e imprime as alterações conforme elas ocorrem:
bson_t *pipeline = bson_new (); const bson_t *doc; mongoc_change_stream_t *change_stream = mongoc_collection_watch (collection, pipeline, NULL); while (true) { bson_error_t error; if (mongoc_change_stream_next (change_stream, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("Received change: %s\n", str); bson_free (str); } else if (mongoc_change_stream_error_document (change_stream, &error, NULL)) { printf("Got error on change stream: %s\n", error.message); break; } } bson_destroy (pipeline); mongoc_change_stream_destroy (change_stream);
Para começar a observar as alterações, execute o aplicação. Em seguida, em um aplicação ou shell separado, execute uma operação de gravação na coleção restaurants
. O exemplo a seguir atualiza um documento no qual o valor do campo name
é "Blarney Castle"
:
bson_t *filter = BCON_NEW ("name", BCON_UTF8 ("Blarney Castle")); bson_t *update = BCON_NEW("$set", "{", "cuisine", BCON_UTF8 ("Irish"), "}"); mongoc_collection_update_one (collection, filter, update, NULL, NULL, NULL);
Quando você atualiza a coleção, o aplicativo de fluxo de alterações imprime a alteração conforme ela ocorre. O evento de alteração impresso é semelhante ao seguinte:
{ "_id": { ... }, "operationType": "update", "clusterTime": { ... }, "ns": { "db": "sample_restaurants", "coll": "restaurants" }, "updateDescription": { "updatedFields": { "cuisine": "Irish" }, "removedFields": [], "truncatedArrays": [] } ... }
Modificar a saída change stream
Você pode passar o parâmetro pipeline
para qualquer função de observação para modificar a saída do fluxo de alteração. Esse parâmetro permite que você observe somente eventos de alteração especificados. Formate o parâmetro como uma lista de objetos, onde cada objeto representa um estágio de agregação .
Você pode especificar os seguintes estágios no parâmetro pipeline
:
$addFields
$match
$project
$replaceRoot
$replaceWith
$redact
$set
$unset
Exemplo de eventos específicos da correspondência
O exemplo a seguir usa o parâmetro pipeline
para incluir um estágio $match
para abrir um fluxo de alteração que registra somente as operações de atualização:
bson_t *pipeline = BCON_NEW ( "pipeline", "[", "{", "$match", "{", "operationType", BCON_UTF8 ("update"), "}", "}", "]"); const bson_t *doc; mongoc_change_stream_t *change_stream = mongoc_collection_watch (collection, pipeline, NULL); while (mongoc_change_stream_next (change_stream, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("Received change: %s\n", str); bson_free (str); } bson_destroy (pipeline); mongoc_change_stream_destroy (change_stream);
Para saber mais sobre como modificar a saída do change stream, consulte a seção Modificar a saída do change stream no manual do MongoDB Server .
Modificar comportamento do relógio
Você pode modificar qualquer função de observação passando opções para a chamada de função. Se você não especificar nenhuma opção, o driver não personalizará a operação.
A tabela a seguir descreve as opções que você pode usar para personalizar o comportamento das funções do relógio:
Opção | Descrição |
---|---|
batchSize | Sets the number of documents to return per batch. |
comment | Specifies a comment to attach to the operation. |
fullDocument | Sets the fullDocument value. To learn more, see the
Include Pre-Images and Post-Images section of this document. |
fullDocumentBeforeChange | Sets the fullDocumentBeforeChange value. To learn more, see the
Include Pre-Images and Post-Images section of this document. |
maxAwaitTimeMS | Sets the maximum await execution time on the server for this operation, in
milliseconds. |
Para obter uma lista completa de opções que você pode usar para configurar a operação de observação, consulte o guia do método de observação no manual do MongoDB Server .
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 sua chamada de função de observação.
A pré-imagem é a versão completa de um documento antes de uma alteração. Para incluir a pré-imagem no change stream , passe um dos seguintes valores para a fullDocumentBeforeChange
opção:
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, passe um dos seguintes valores para a fullDocument
opção:
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 a função mongoc_collection_watch()
em uma collection e inclui a pós-imagem de documentos atualizados nos resultados especificando a opção fullDocument
:
bson_t *pipeline = bson_new (); bson_t *opts = BCON_NEW ("fullDocument", BCON_UTF8 ("updateLookup")); const bson_t *doc; mongoc_change_stream_t *change_stream = mongoc_collection_watch (collection, pipeline, opts); while (true) { bson_error_t error; if (mongoc_change_stream_next (change_stream, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("Received change: %s\n", str); bson_free (str); } else if (mongoc_change_stream_error_document (change_stream, &error, NULL)) { printf("Got error on change stream: %s\n", error.message); break; } } bson_destroy (pipeline); bson_destroy (opts); mongoc_change_stream_destroy (change_stream);
Com o aplicativo 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 seguinte:
{ "_id": ..., "operationType": "update", "clusterTime": ..., "wallTime": ..., "fullDocument": { "_id": { ... }, "address": ..., "borough": "Queens", "cuisine": "Irish", "grades": [ ... ], "name": "Blarney Castle", "restaurant_id": ... }, "ns": { "db": "sample_restaurants", "coll": "restaurants" }, "documentKey": { "_id": ... }, "updateDescription": { "updatedFields": { "cuisine": "Irish" }, "removedFields": [], "truncatedArrays": [] } }
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 uma das funções ou tipos discutidos neste guia, consulte a seguinte documentação da API: