Menu Docs
Página inicial do Docs
/ / /
Driver C
/

Monitorar alterações de dados

Nesta página

  • Visão geral
  • Dados de amostra
  • Abrir um fluxo de alterações
  • Abrir um exemplo de change stream
  • Modificar a saída change stream
  • Exemplo de eventos específicos da correspondência
  • Modificar comportamento do relógio
  • Incluir pré-imagens e pós-imagens
  • Informações adicionais
  • Documentação da API

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.

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 .

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 MongoDB

  • mongoc_database_watch(): Monitora alterações em todas as coleções no banco de banco de dados

  • mongoc_collection_watch(): monitora alterações na coleção

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": []
}
...
}

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

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 .

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 .

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 .

Para saber mais sobre fluxos de alterações, consulte Change Streams de alterações no manual do MongoDB Server .

Para saber mais sobre qualquer uma das funções ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Acessar dados de um cursor