Resumo
updateUm evento
updateocorre quando uma operação atualiza um documento em uma coleção.Observação
Desambiguação
Para saber mais sobre eventos que ocorrem quando as opções de coleta são modificadas, consulte o evento
modify.
Descrição
Campo | Tipo | Descrição | |||
|---|---|---|---|---|---|
| Documento | Um objeto BSON que serve como um identificador para o evento de fluxo de alterações. Este valor é utilizado como O tipo de Para obter um exemplo de como retomar um fluxo de alterações por | |||
| Timestamp |
Devido aos limites de tamanho do oplog , transações com vários documentos podem criar várias entradas no oplog. Em uma transação, os eventos de change stream encenados em uma determinada entrada do oplog compartilham o mesmo Em clusters fragmentados, eventos com o mesmo Para identificar eventos para uma única transação, você pode usar a combinação de | |||
| UUID | UUID identificando a coleção onde ocorreu a alteração. Novidades na versão 6.0. O campo | |||
| documento | Documento que contém o valor Para coleções fragmentadas, este campo também exibe a chave de fragmentação completa do documento. O campo | |||
| documento | O documento criado ou modificado por uma operação CRUD. Este campo aparece somente se você configurou o fluxo de alteração com Para mais informações, consulte Pesquisar documento completo para atualizar operações. Alterado na versão 6.0. A partir do MongoDB 6.0, se você definir a opção | |||
| documento | O documento antes das alterações serem aplicadas pela operação. Ou seja, a pré-imagem do documento. Este campo está disponível quando você habilita o campo Novidades na versão 6.0. | |||
| documento | O identificador da sessão associada à transação. Somente presente se a operação fizer parte de uma transação de vários documentos. | |||
| documento | O namespace (banco de dados e/ou coleção) afetado pelo evento. | |||
| string | O nome da coleção onde o evento ocorreu. | |||
| string | O nome do banco de dados onde ocorreu o evento. | |||
| string | O tipo de operação que os relatórios de notificação de alteração. Retorna um valor de | |||
| documento | Um documento que descreve os campos que foram atualizados ou removidos pela operação de atualização. | |||
updateDescription.disambiguatedPaths | documento | Um documento que fornece esclarecimento dos descritores de campo ambíguos em Quando o evento de alteração Exige que você configure a opção showExpandedEvents para Novidades na versão 6.1. | |||
updateDescription.removedFields | array | Uma array de campos que foram removidos pela operação de atualização. | |||
updateDescription.truncatedArrays | array | Uma array de documentos que registram truncamentos de array executados com atualizações baseadas em pipelin usando uma ou mais das seguintes etapas: Se toda a array for substituída, as truncações serão reportadas em updateDescription.updatedFields. | |||
updateDescription.truncatedArrays.field | string | O nome do campo truncado. | |||
updateDescription.truncatedArrays.newSize | inteiro | O número de elementos na array truncada. | |||
updateDescription.updatedFields | documento | Um documento cujas chaves correspondem aos campos que foram modificados pela operação de atualização. O valor de cada campo corresponde ao novo valor desses campos, em vez da operação que resultou no novo valor. | |||
| Número longo | Juntamente com o lsid, um número que ajuda a identificar exclusivamente uma transação. Somente presente se a operação fizer parte de uma transação de vários documentos. | |||
| A data e hora do servidor da operação do banco de dados. Novidades na versão 6.0. |
Comportamento
Documentar pré e pós-imagens
A partir do MongoDB 6.0, você verá um documento fullDocumentBeforeChange com os campos antes de o documento ser alterado (ou excluído) se executar estas etapas:
Ative o novo campo
changeStreamPreAndPostImagespara uma coleção utilizandodb.createCollection(),createoucollMod.Configure
fullDocumentBeforeChangepara"required"ou"whenAvailable"emdb.collection.watch().
Exemplo de documento fullDocumentBeforeChange na saída do fluxo de mudança:
"fullDocumentBeforeChange" : { "_id" : ObjectId("599af247bb69cd89961c986d"), "userName" : "alice123", "name" : "Alice Smith" }
Para obter exemplos completos com a saída do fluxo de alterações, consulte Fluxos de alterações com imagens pré e pós-documento.
As imagens pré e pós não estarão disponíveis para um change stream se as imagens forem:
Não habilitadas na coleção no momento de uma operação de atualização ou exclusão de documento.
Removido após o tempo de retenção pré e pós-imagem definido em
expireAfterSeconds.O exemplo a seguir define
expireAfterSecondspara100segundos em um cluster inteiro:use admin db.runCommand( { setClusterParameter: { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: 100 } } } } ) Observação
O
setClusterParametercomando não é suportado em clusters MongoDB Atlas . Para obter informações sobre o suporte do Atlas para todos os comandos, consulte Comandos não suportados no Atlas.O exemplo a seguir retorna as configurações atuais do
changeStreamOptions, incluindoexpireAfterSeconds:db.adminCommand( { getClusterParameter: "changeStreamOptions" } ) Se um change stream for removido do oplog, as imagens pré e pós correspondentes também serão excluídas, independentemente do tempo de retenção pré e pós-imagem
expireAfterSeconds.
Considerações adicionais:
Habilitar pré e pós-imagens consome espaço de armazenamento e adiciona tempo de processamento. Ative as imagens anteriores e posteriores somente se precisar delas.
Limite o tamanho do evento do fluxo de alterações para menos de 16 mebibytes. Para limitar o tamanho do evento, você pode:
Limite o tamanho do documento a 8 megabytes. Você pode solicitar imagens pré e pós simultaneamente na saída do change stream se outros campos de evento de change stream, como
updateDescriptionnão forem grandes.Solicite apenas pós-imagens na saída do fluxo de alterações para documentos de até 16 mebibytes se outros campos de evento de fluxo de alterações como
updateDescriptionnão forem grandes.Solicite somente pré-imagens na saída do change stream para documentos de até 16 mebibytes se:
as atualizações do documento afetam apenas uma pequena fração da estrutura ou conteúdo do documento, e
não causa um evento de alteração
replace. Um eventoreplacesempre inclui o pós-imagem.
Para solicitar uma pré-imagem, defina
fullDocumentBeforeChangecomorequiredouwhenAvailableemdb.collection.watch(). Para solicitar uma pós-imagem, definafullDocumentusando o mesmo método.As pré-imagens são escritas na coleção
config.system.preimages.A coleção
config.system.preimagespode ficar grande. Para limitar o tamanho da coleção, você pode definirexpireAfterSecondstempo para as pré-imagens, conforme mostrado anteriormente.As pré-imagens são removidas de forma assíncrona por um processo de plano de fundo.
Importante
Funcionalidade incompatível com versões anteriores
A partir do MongoDB 6.0, se você estiver usando imagens anteriores e posteriores de documentos para change streams, deverá desabilitar changeStreamPreandPostImages para cada coleção usando o collMod comando antes de poder fazer o downgrade para uma versão anterior do MongoDB.
Dica
Para alterar eventos de transmissão e saída, consulte Alterar eventos.
Para observar alterações em uma collection, consulte
db.collection.watch().Para obter exemplos completos com a saída do fluxo de alterações, consulte Fluxos de alterações com imagens pré e pós-documento.
Desambiguação de Caminho
Novidades na versão 6.1.
O campo updateDescription observa alterações feitas em campos específicos em documentos por uma operação. Estes descritores de campo utilizam pontos (.) como separadores de caminho e números como índices de array, o que leva a alguma ambiguidade quando contém nomes de campo que utilizam pontos ou números.
Quando um evento do update relata alterações envolvendo campos ambíguos, o documento do disambiguatedPaths fornece a chave de caminho com uma array listando cada componente de caminho.
Observação
O campo disambiguatedPaths só está disponível em fluxos de alteração iniciados com a opção showExpandedEvents
Por exemplo, considere um documento que relacione as pessoas e as cidades em que vivem:
{ "name": "Anthony Trollope", "home.town": "Oxford", "residences": [ {"0": "Oxford"}, {"1": "Sunbury"} ] }
Quando uma atualização modifica o campo
home.towndeOxfordparaLondon, ela produz uma descrição de atualização que se parece com isto:"updateDescription": { "updatedFields": { "home.town": "London" }, "disambiguatedPaths": { "home.town": [ "home.town" ] } } Como o campo
home.towncontém um período, o campodisambiguatedPathsmostra uma array com um valor, para indicar quetownnão é um subcampo dehome.Quando uma atualização modifica um valor na array
residencespara fazer a mesma alteração, ela produz uma descrição de atualização que se parece com isto:"updateDescription": { "updatedFields": { "residences.0.0": "London" }, "disambiguatedPaths": { "residences.0.0": [ "residences", 0, "0" ] } } Os caminhos desambiguados incluem um número inteiro
0para indicar o índice de array e a string"0"para indicar o nome do campo dentro do documento aninhado.
Há dois casos em que o disambiguatedPath não inclui um campo numérico:
Quando o primeiro campo no caminho é uma sequência numérica (ou seja,
0.name). Isto não é ambíguo, pois o primeiro campo não pode ser um índice de array.Quando o campo de string numérica tiver zeros iniciais (ou seja,
0001). Isso não é ambíguo, pois um número inteiro não pode ter zeros à esquerda.
Atualizar operações
O comando update pode produzir diferentes eventos de alteração (não apenas update), dependendo das alterações reais que ele faz na collection.
Alterar evento | Descrição |
|---|---|
A operação de atualização modificou um documento existente . | |
A operação de atualização substituiu o documento ou gerou um diff mais verboso do que o documento original , fazendo com que o MongoDB o substituísse. | |
A operação de atualização tentou atualizar um documento que não existe e, em vez disso, adicionou o documento à coleção. Isto ocorre somente quando a atualização é executada com a opção |
Array Updates
As atualizações de arrays produzem eventos de alteração update, mas o updateDescription.updateFields pode mostrar valores diferentes.
Por exemplo, considere o seguinte documento e atualizações:
db.students.insertOne( { student_id: 1, scores: [ ] } ) db.students.updateOne( { student_id: 1 }, { $push: { scores: 0.85 } } ) db.students.updateOne( { student_id: 1 }, { $push: { scores: 0.94 } } ) db.students.updateOne( { student_id: 1 }, { $pull: { scores: 0.94 } } )
A primeira atualização opera em uma array vazia. Aqui, o $push produz um evento de alteração update em que o campo é substituído por uma array de entrada única com o valor fornecido:
{ _id: { _data: '82642AD66B000000012B022C0100296E5A10045DC4B11BEA5F4319A8E7CAF46816ED71461E5F6964002B060004' }, operationType: 'update', clusterTime: Timestamp({ t: 1680529003, i: 1 }), ns: { db: 'communication_chat', coll: 'students' }, documentKey: { student_id: 1 }, updateDescription: { updatedFields: { scores: [ 0.85 ] }, removedFields: [], truncatedArrays: [] } }
Na segunda operação de atualização, a array agora contém valores. O $push adiciona uma nova entrada na array. O evento de alteração update então o mostra como uma alteração na nova posição na array (ou seja, scores.1):
{ _id: { _data: '82642AD673000000012B022C0100296E5A10045DC4B11BEA5F4319A8E7CAF46816ED71461E5F6964002B060004' }, operationType: 'update', clusterTime: Timestamp({ t: 1680529011, i: 1 }), ns: { db: 'communication_chat', coll: 'students' }, documentKey: { student_id: 1 }, updateDescription: { updatedFields: { 'scores.1': 0.94 }, removedFields: [], truncatedArrays: [] } }
Se você executar a operação de atualização novamente para adicionar uma terceira pontuação ao registro do aluno, ela produzirá um evento de alteração update que modifica scores.2.
A remoção de itens da array com o operador $pull produz um evento de alteração que mostra a nova array:
{ _id: { _data: '82642AD673000000012B022C0100296E5A10045DC4B11BEA5F4319A8E7CAF46816ED71461E5F6964002B060004' }, operationType: 'update', clusterTime: Timestamp({ t: 1680529011, i: 1 }), ns: { db: 'communication_chat', coll: 'students' }, documentKey: { student_id: 1 }, updateDescription: { updatedFields: { scores: [ 0.85 ] }, removedFields: [], truncatedArrays: [] } }
Truncamento de array
As operações de atualização que reduzem o número de elementos em arrays por meio das atualizações de pipeline, como com os estágios de agregação $addFields ou $set, mostram a array atualizada e o novo tamanho no campo truncatedArrays.
db.students.insertOne( { student_id: 2, scores: [ 0.85, 0.94, 0.78 ] } ) db.students.updateOne( { student_id: 2 }, [ { $addFields: { scores: [ 0.85, 0.94 ] } } ] ) db.students.updateOne( { student_id: 2 }, [ { $addFields: { scores: [ 0.85, 0.94, 0.78 ] } } ] )
O evento de alteração da primeira atualização, que usou o estágio $addFields para remover um valor do campo scores, mostra a alteração no campo truncatedArrays:
{ _id: { _data: '82642AD673000000012B022C0100296E5A10045DC4B11BEA5F4319A8E7CAF46816ED71461E5F6964002B060004' }, operationType: 'update', clusterTime: Timestamp({ t: 1680529011, i: 1 }), ns: { db: 'communication_chat', coll: 'students' }, documentKey: { student_id: 2 }, updateDescription: { updatedFields: {}, removedFields: [], truncatedArrays: [ { fields: "scores", newSize: 2 } ] } }
O evento de alteração da segunda atualização, que usou o estágio $addFields para adicionar um valor de volta ao campo scores, mostra a atualização no campo updatedFields:
{ _id: { _data: '82642AD673000000012B022C0100296E5A10045DC4B11BEA5F4319A8E7CAF46816ED71461E5F6964002B060004' }, operationType: 'update', clusterTime: Timestamp({ t: 1680529011, i: 1 }), ns: { db: 'communication_chat', coll: 'students' }, documentKey: { student_id: 2 }, updateDescription: { updatedFields: { scores.2: 0.78 }, removedFields: [], truncatedArrays: [] } }
Exemplo
O exemplo seguinte ilustra um evento update:
{ "_id": { <Resume Token> }, "operationType": "update", "clusterTime": <Timestamp>, "wallTime": <ISODate>, "ns": { "db": "engineering", "coll": "users" }, "documentKey": { "_id": ObjectId("58a4eb4a30c75625e00d2820") }, "updateDescription": { "updatedFields": { "email": "alice@10gen.com" }, "removedFields": ["phoneNumber"], "truncatedArrays": [ { "field" : "vacation_time", "newSize" : 36 } ] } }
O exemplo seguinte ilustra um evento update para alterar fluxos abertos com a opção fullDocument : updateLookup:
{ "_id": { <Resume Token> }, "operationType": "update", "clusterTime": <Timestamp>, "wallTime": <ISODate>, "ns": { "db": "engineering", "coll": "users" }, "documentKey": { "_id": ObjectId("58a4eb4a30c75625e00d2820") }, "updateDescription": { "updatedFields": { "email": "alice@10gen.com" }, "removedFields": ["phoneNumber"], "truncatedArrays": [ { "field" : "vacation_time", "newSize" : 36 } ], "disambiguatedPaths": { } }, "fullDocument": { "_id": ObjectId("58a4eb4a30c75625e00d2820"), "name": "Alice", "userName": "alice123", "email": "alice@10gen.com", "team": "replication" } }
O documento fullDocument representa a versão mais atual acordada majoritariamente do documento atualizado. O documento fullDocument pode variar do documento no momento da operação de atualização, dependendo do número de operações de intercalação confirmadas que ocorrem entre a operação de atualização e a pesquisa do documento.