Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Monitorar alterações de dados

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 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 do sample_restaurants a partir do conjunto 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 MongoDB Get Started.

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

O número máximo de documentos que um fluxo de alterações pode retornar em cada lote, que se aplica à função de observação. Por padrão, as funções de observação têm um tamanho de lote inicial de 101 documentos e um tamanho máximo de 16 mebibytes (MiB) para cada lote subsequente. Esta opção pode forçar um limite menor que 16 MiB, mas não maior. Para obter detalhes, consulte Lotes de cursores no manual do MongoDB Server.

comment

Especifica um comentário a ser anexado à operação.

fullDocument

Define o valor fullDocument. Para aprender mais, consulte a seção Incluir pré-imagens e pós-imagens deste documento.

fullDocumentBeforeChange

Define o valor fullDocumentBeforeChange. Para aprender mais, consulte a seção Incluir pré-imagens e pós-imagens deste documento.

maxAwaitTimeMS

Define o tempo máximo de execução de espera no servidor para esta operação, em milissegundos.

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 evento, passe um dos seguintes valores para a opção fullDocumentBeforeChange:

  • 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 opção fullDocument:

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