Definição
$changeStreamGera um cursor deChange Stream em uma collection, banco de dados de dados ou cluster inteiro. Deve ser usado como o primeiro estágio em um agregação pipeline.
O estágio
$changeStreamtem a seguinte sintaxe:{ $changeStream: { allChangesForCluster: <boolean>, fullDocument: <string>, fullDocumentBeforeChange: <string>, resumeAfter: <document> showExpandedEvents: <boolean>, startAfter: <document> startAtOperationTime: <timestamp> } } ParâmetroDescriçãoallChangesForClusterOpcional: define se o fluxo de alterações deve incluir todas as alterações no cluster. Só pode ser aberto no banco de dados
admin.fullDocumentOpcional: Especifica se as notificações de alteração incluem uma cópia do documento completo quando modificado por operações
update.default: notificações de alteração não incluem o documento completo para operações deupdate.required: as notificações de alteração incluem uma cópia do documento modificado conforme ele apareceu imediatamente após a alteração. Se o documento não for encontrado, o change stream gerará um erro.Para usar esta opção, você deve primeiro utilizar o comando
collModpara habilitar a opção dechangeStreamPreAndPostImages.Novidades na versão 6.0.
updateLookup: as notificações de alteração incluem uma cópia do documento modificado pela alteração. Este é o documento confirmado pela maioria atual ounullse não existir mais.whenAvailable: A notificação de alteração inclui uma cópia do documento modificado como ele apareceu imediatamente após a alteração ounullse o documento não estiver disponível.Para usar esta opção, você deve primeiro utilizar o comando
collModpara habilitar a opção dechangeStreamPreAndPostImages.Novidades na versão 6.0.
No caso de atualizações parciais, a notificação de alteração também fornece uma descrição da alteração.
fullDocumentBeforeChangeInclua o documento completo antes da alteração. Este campo aceita os seguintes valores:
off: Desabilita a inclusão do documento antes da alteração.whenAvailable: Inclui documento anterior à alteração. A query não falhará se o documento não modificado não estiver disponível.required: inclui documento anterior à alteração. A query falha se o documento não modificado não estiver disponível.
resumeAfterOpcional. Especifica um token de currículo como o ponto de partida lógico para o fluxo de alteração. Não pode ser usado para retomar o fluxo de alterações após um evento
invalidate.resumeAfteré mutuamente exclusivo comstartAfterestartAtOperationTime.showExpandedEventsEspecifica se incluir eventos de mudança adicionais, como DDL e operações de índice.
Novidades na versão 6.0.
startAfterOpcional. Especifica um token de resumo como o ponto de partida lógico para o fluxo de alterações. Ao contrário de
resumeAfter,startAfterpode retomar notificações após um eventoinvalidatecriando um novo fluxo de alterações.startAfteré mutuamente exclusivo comresumeAfterestartAtOperationTime.startAtOperationTimeEspecifica uma hora como o ponto de partida lógico para o change stream. Não pode ser utilizado com campos
resumeAfteroustartAfter.
Suporte à API Estável
Os change streams estão incluídos na Stable API V1. No entanto, a opção showExpandedEvents não está incluída na Stable API V1.
Exemplos
Para criar um cursor de change stream com o estágio de aggregation, execute o comando aggregate.
var cur = db.names.aggregate( [ { $changeStream: {} } ] )
Para abrir o cursor, execute cur.
Quando o fluxo de alteração detecta uma alteração, o método next() retorna uma notificação de alteração de evento. Por exemplo, após executar o cur.next(), o MongoDB retorna um documento semelhante ao seguinte:
{ "_id": { _data: "8262E2EE54000000022B022C0100296E5A100448E5E3DD01364019AE8FE8C6859527E046645F6964006462E2EE54C8756C0D5CF6F0720004" }, "operationType": "insert", "clusterTime": Timestamp({ t: 1659039316, i: 2 }), "wallTime": ISODate("2022-07-28T20:15:16.148Z"), "fullDocument": { "_id": ObjectId("62e2ee54c8756c0d5cf6f072"), "name": "Walker Percy" }, "ns": { "db": "test", "coll": "names" }, "documentKey": { _id: ObjectId("62e2ee54c8756c0d5cf6f072") } }
Para usar o driver MongoDB .NET/C# para adicionar um estágio $changeStream a um pipeline de agregação, chame o método ChangeStream() em um objeto PipelineDefinition.
O exemplo a seguir cria um estágio de pipeline que retorna um cursor de fluxo de mudança:
var pipeline = new EmptyPipelineDefinition<Movie>() .ChangeStream();
Você pode usar um objeto ChangeStreamStageOptions para personalizar o comportamento do change stream. O exemplo a seguir executa a mesma operação $changeStream do exemplo anterior, mas especifica as seguintes opções:
A opção
FullDocumentespecifica que as notificações de alteração não incluem uma cópia do documento completo quando modificado por operações de atualização.A opção
StartAtOperationTimeespecifica o ponto de partida lógico para o fluxo de alteração.
var changeStreamOptions = new ChangeStreamStageOptions() { FullDocument = ChangeStreamFullDocumentOption.Default, StartAtOperationTime = new BsonTimestamp(300), }; var pipeline = new EmptyPipelineDefinition<Movie>() .ChangeStream(changeStreamOptions);
Observação
Preferir o método Watch()
Sempre que possível, use o método IMongoCollection<TDocument>.Watch() em vez deste estágio de agregação . Use o método ChangeStream() somente se os estágios subsequentes projeto o token de retomada (_id) ou se você não quiser que o cursor resultante seja retomado automaticamente.
Você pode usar o método watch() e o método aggregate() para executar uma operação $changeStream. $changeStream retorna um ChangeStreamCursor quando você passa o pipeline de agregação para o método watch() em um objeto MongoDB Collection. $changeStream retorna um AggregationCursor quando você passa o pipeline de agregação para o método aggregate().
Importante
Retomabilidade $changeStream
Se você passar um change stream para o método aggregate(), o change stream não poderá ser retomado. Um change stream só é retomado se você passá-lo para o método watch(). Para saber mais sobre a capacidade de retomada, consulte Retomar um fluxo de alterações.
O exemplo seguinte cria e executa um pipeline que retorna um ChangeStreamCursor:
const pipeline = [{ $changeStream: {} }]; const changeStream = collection.watch(pipeline); return changeStream;
Você pode usar um objeto ChangeStreamOptions para personalizar o comportamento do change stream. O exemplo a seguir executa a mesma operação $changeStream do exemplo anterior, mas especifica as seguintes opções:
A opção
fullDocumentespecifica que, se uma operação de atualização modificar um documento, as notificações de alteração incluirão uma cópia do documento completo.A opção
startAtOperationTimeespecifica o ponto de partida lógico para o fluxo de alteração.
const pipeline = [ { $changeStream: { fullDocument: 'updateLookup', startAtOperationTime: 3000 } } ]; const changeStream = collection.watch(pipeline); return changeStream;
Saiba mais
Para mais informações sobre como alterar as notificações de transmissão, consulte Alterar eventos.
Para saber mais sobre os estágios de pipeline relacionados, consulte o guia$changeStreamSplitLargeEvent.