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

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

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

  • Abrir um fluxo de alterações

  • Aplique operadores de agregação ao seu change stream

  • Incluir pré-imagens e pós-imagens

  • Informações adicionais

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 .

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 Conjunto de réplicas do Oplog 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()
Collection
Monitors changes to the individual collection
Database
Monitors changes to all collections in the database
Client
Monitors all changes in the connected MongoDB deployment

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

Você pode encadear o método pipeline() ao método watch() para especificar quais eventos de alteração o change stream recebe. Passe um aggregation pipeline como parâmetro para pipeline().

Para saber quais operadores de aggregation sua versão do servidor MongoDB suporta, consulte Modificar a saída do change stream no manual do servidor.

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 .

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:

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.

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

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

Para saber mais sobre qualquer um dos métodos ou tipos mencionados neste guia, consulte a seguinte documentação da API:

Voltar

Acessar dados usando um cursor