Fluxos de change streams
Nesta página
- Visão geral
- Dados de amostra
- Abrir um fluxo de alterações
- Exemplo
- Aplique operadores de agregação ao seu change stream
- Exemplo
- Incluir pré-imagens e pós-imagens
- Crie uma coleção com pré-imagem e pós-imagens habilitadas
- Exemplo de configuração pré-imagem
- Exemplo de configuração pós-imagem
- Informações adicionais
- Documentação da API
Visão geral
Neste guia, você pode aprender como usar um change stream para monitorar alterações em tempo real em seus dados. Um change stream é um recurso do MongoDB Server que permite que sua aplicação assine alterações de dados em uma única collection, reconhecimento de data center ou sistema.
Você pode abrir um change stream para ajudar a executar as seguintes ação:
Habilite os dispositivos para rastrear e React a evento, como máquinas de detecção de movimento
Crie um aplicativo que monitore as mudanças nos preços das ações
Gere um registro da atividade dos funcionários para tarefas específicas
Você pode especificar um conjunto de operadores de agregação para filtrar e transformar os dados que seu aplicativo recebe. Quando conectado a um sistema MongoDB v6.0 ou posterior, você também pode configurar os eventos para incluir os dados do documento antes e depois da alteração.
Para saber como abrir e configurar um change stream, navegue até as seguintes seções:
Dados de amostra
The examples in this guide monitor changes to the directors
collection. Suponha que essa collection contenha os seguintes documento, que são modelados como estruturas:
let docs = vec! [ Director { name: "Todd Haynes".to_string(), movies: vec! ["Far From Heaven".to_string(), "Carol".to_string()], oscar_noms: 1, }, Director { name: "Jane Campion".to_string(), movies: vec! ["The Piano".to_string(), "Bright Star".to_string()], oscar_noms: 5, } ];
Dica
Para saber como inserir documentos em uma coleção, consulte o guia Inserir documentos .
Abrir um fluxo de alterações
Você pode abrir um fluxo de alterações para assinar tipos específicos de alterações de dados e produzir eventos de alteração em seu aplicativo.
Para abrir um change stream, chame o método watch()
em uma instância Collection
, Database
ou Client
.
Importante
Sistemas standalone do MongoDB não oferecem suporte a change streams porque o recurso exige um oplog de conjunto de réplicas. Para saber mais sobre o oplog, consulte a página de oplogConjunto de réplicas no manual do servidor.
O tipo de estrutura no qual você chama o método watch()
determina o escopo de eventos que o change stream escuta. A tabela a seguir descreve o comportamento do método watch()
com base em seu objeto de chamada:
Tipo de estrutura | Comportamento de watch() |
---|---|
| Monitors changes to the individual collection |
| Monitors changes to all collections in the database |
| Monitors all changes in the connected MongoDB deployment |
Exemplo
O exemplo a seguir abre um change stream na collection directors
. O código imprime o tipo de operação e o documento modificado de cada evento de alteração acessando os campos operation_type
e full_document
de cada instância ChangeStreamEvent
:
let mut change_stream = my_coll.watch().await?; while let Some(event) = change_stream.next().await.transpose()? { println!("Operation performed: {:?}", event.operation_type); println!("Document: {:?}", event.full_document); }
Dica
Para obter uma lista completa dos ChangeStreamEvent
campos de estrutura, consulte ChangeStreamEvent na documentação da API.
Se você inserir um documento na coleção directors
na qual o valor name
é "Wes Anderson"
, o código anterior produzirá o seguinte resultado:
Operation performed: Insert Document: Some(Director { name: "Wes Anderson", movies: [...], oscar_noms: 7 })
Aplique operadores de agregação ao seu change stream
Você pode encadear o método pipeline()
ao método watch()
para especificar quais eventos de alteração o change stream recebe. Passe um agregação pipeline como parâmetro para pipeline()
.
Para saber quais operadores de agregação sua versão do MongoDB Server suporta, consulte Modificar a saída do change stream no manual do servidor.
Exemplo
O exemplo a seguir cria um pipeline de agregação para filtrar operações de atualização. Em seguida, o código passa o pipeline para o método pipeline()
, configurando o change stream para receber e imprimir apenas eventos de alteração para operações de atualização:
let mut update_change_stream = my_coll.watch() .pipeline(vec![doc! { "$match" : doc! { "operationType" : "update" } }]) .await?; while let Some(event) = update_change_stream.next().await.transpose()? { println!("Update performed: {:?}", event.update_description); }
Se você atualizar o documento no qual o valor name
é "Todd Haynes"
aumentando o valor do campo oscar_noms
, o código anterior produzirá o seguinte resultado:
Update performed: Some(UpdateDescription { updated_fields: Document({ "oscar_noms": Int64(2)}), removed_fields: [], truncated_arrays: Some([]) })
Dica
Para saber como realizar operações de atualização, consulte o guia Modificar documento .
Incluir pré-imagens e pós-imagens
Você pode configurar o evento de alteração para conter ou omitir os seguintes dados:
Pré-imagem: um documento que representa a versão do documento antes da operação, se houver
Pós-imagem: um documento que representa a versão do documento após a operação, se existir
Importante
Você pode habilitar pré e pós-imagens em coleções somente se seu sistema usar o MongoDB v6.0 ou posterior.
Para receber evento de change stream que incluem uma pré-imagem ou pós-imagem, você deve executar a seguinte ação:
Habilite pré-imagens e pós-imagens para a coleção em seu sistema do MongoDB.
Dica
Para saber como ativar as pré e pós-imagens em sua implantação, consulte Fluxo de alterações com pré e pós-imagens de documentos no manual do servidor.
Para saber como instruir o driver a criar uma collection com pré-imagens e pós-imagens habilitadas, consulte a seção Criar uma collection com pré-imagem e pós-imagens habilitadas desta página.
Configure seu change stream para recuperar as pré-imagens e as pós-imagens ou as duas imagens. Durante essa configuração, você pode instruir o driver a exigir pré e pós-imagens ou incluí-las somente quando disponíveis.
Dica
Para configurar seu change stream para registrar a pré-imagem em eventos de alteração, consulte o Exemplo de configuração de pré-imagem nesta página.
Para configurar seu change stream para registrar a pós-imagem em eventos de alteração, consulte o Exemplo de configuração pós-imagem nesta página.
Crie uma coleção com pré-imagem e pós-imagens habilitadas
Para habilitar documentos de pré e pós-imagem para sua coleção, use o método de construtor de opção change_stream_pre_and_post_images()
. O exemplo a seguir usa este método de construtor para especificar opções de collection e cria uma collection para a qual imagens pré e pós estão disponíveis:
let enable = ChangeStreamPreAndPostImages::builder().enabled(true).build(); let result = my_db.create_collection("directors") .change_stream_pre_and_post_images(enable) .await?;
Você pode alterar a opção pré-imagem e pós-imagem em uma coleção existente executando o comando collMod
a partir do MongoDB Shell ou a partir do seu aplicativo. Para saber como executar esta operação, consulte o guia Executar um comando e a entrada sobre collMod no manual do servidor MongoDB.
Aviso
Se você ativou pré-imagens ou pós-imagens em uma collection, modificar essas configurações com collMod
pode fazer com que os change stream existentes nessa collection sejam encerrados.
Exemplo de configuração pré-imagem
Para configurar um change stream que retorna eventos de alteração contendo a pré-imagem, use o método construtor de opções full_document_before_change()
. O exemplo a seguir especifica opções de change stream e cria um change stream que retorna documentos com pré-imagem:
let pre_image = FullDocumentBeforeChangeType::Required; let mut change_stream = my_coll.watch() .full_document_before_change(pre_image) .await?; while let Some(event) = change_stream.next().await.transpose()? { println!("Operation performed: {:?}", event.operation_type); println!("Pre-image: {:?}", event.full_document_before_change); }
O exemplo anterior passa um valor de FullDocumentBeforeChangeType::Required
para o método de construtor de opção full_document_before_change()
. Este método configura o change stream para exigir pré-imagens para eventos de alteração de substituição, atualização e exclusão. Se a pré-imagem não estiver disponível, o driver gerará um erro.
Se você atualizar um documento no qual o valor de name
for "Jane Campion"
, o evento de alteração produzirá o seguinte resultado:
Operation performed: Update Pre-image: Some(Director { name: "Jane Campion", movies: ["The Piano", "Bright Star"], oscar_noms: 5 })
Exemplo de configuração pós-imagem
Para configurar um change stream que retorna eventos de alteração contendo a pós-imagem, use o método construtor de opções full_document()
. O exemplo a seguir especifica opções de change stream e cria um change stream que retorna documentos pós-imagem:
let post_image = FullDocumentType::WhenAvailable; let mut change_stream = my_coll.watch() .full_document(post_image) .await?; while let Some(event) = change_stream.next().await.transpose()? { println!("Operation performed: {:?}", event.operation_type); println!("Post-image: {:?}", event.full_document); }
O exemplo anterior passa um valor de FullDocument::WhenAvailable
para o método de construtor de opção full_document()
. Este método configura o change stream para retornar pós-imagens para substituir, atualizar e excluir eventos de alteração se a pós-imagem estiver disponível.
Se você excluir o documento no qual o valor de name
é "Todd Haynes"
, o evento de alteração produzirá o seguinte resultado:
Operation performed: Delete Post-image: None
Informações adicionais
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos mencionados neste guia, consulte a seguinte documentação da API: