Para executar operações de atualização, você pode usar o pipeline de agregação. Você pode construir e executar pipelines de agregação para executar atualizações no MongoDB Atlas, MongoDB Compass, MongoDB Shell ou Drivers.
Com as operações de atualização, o aggregation pipeline pode consistir nos seguintes estágios:
O uso do aggregation pipeline permite uma instrução de atualização mais expressiva, como atualizações condicionais Express com base em valores de campo atuais ou atualização de um campo usando o valor de outro(s) campo(s).
Observação
Caracteres em dólares em valores de campo
Ao usar um pipeline de agregação , limpe todas as strings que forem passadas pela entrada do usuário ou criadas dinamicamente a partir da análise de dados. Se qualquer valor de campo for valor de string literal e começar com um caractere de dólar, o valor deverá ser passado para o operador de agregação $literal. O exemplo a seguir demonstra o uso do agregação pipeline $set e do operador $literal para atualizar o documento com um _id de 1 para ter um campo cost de $27.
db.inventory.updateOne( { _id: 1 }, [ { $set: { "cost": { $literal: "$27" } } } ] ) 
Criar um Aggregation Pipeline de Atualização no Atlas
Você pode utilizar a IU do Atlas MongoDB para criar um pipeline de agregação para executar atualizações. Para criar e executar pipelines de agregação na IU do MongoDB Atlas, você deve ter a função Project Data Access Read Only ou superior.
Acessar o Construtor de Aggregation Pipeline.
- Selecione o banco de dados para a collection. - O painel principal e Namespaces no lado esquerdo listam as coleções no banco de dados. 
- Selecione a collection. - Selecione a coleção no lado esquerdo ou no painel principal. O painel principal exibe as visualizações Find, Indexes e Aggregation. 
- Selecione a visualização Agregação. - Quando abre pela primeira vez a vista Aggregation , Atlas exibe um pipeline de agregação vazio. 
Crie um aggregation pipeline para realizar atualizações.
- Selecione um estágio de agregação. - Selecione um estágio de agregação no menu suspenso Select no painel inferior esquerdo. - O botão à direita do menu suspenso determina se o estágio está ativado. - Para realizar atualizações com uma agregação, use uma destas etapas: 
- Preencha seu estágio de agregação. - Preencha seu estágio com os valores apropriados. Se o Modo de Comentário estiver habilitado, o construtor de pipeline fornecerá diretrizes sintáticas para o estágio selecionado. - Conforme você modifica seu estágio, o Atlas atualiza os documentos de visualização à direita com base nos resultados do estágio atual. - Para obter exemplos do que você pode incluir em seu estágio de agregação, consulte os exemplos nesta página. - Adicione estágios conforme necessário. Para mais informações sobre como criar pipelines de agregação no Atlas, consulte Criar um pipeline de agregação. 
Exporte o aggregation pipeline.
- Clique em Exportar para Idioma. - Você pode encontrar este botão na parte superior do construtor de pipeline. 
- Selecione o idioma de exportação desejado. - No menu Export Pipeline To, selecione o idioma desejado. - O painel My Pipeline à esquerda exibe seu pipeline na sintaxe do MongoDB Shell. Você pode copiar isso diretamente para executar seu pipeline no MongoDB Shell. - O painel à direita exibe seu pipeline na linguagem selecionada. Selecione a linguagem preferida. 
- Selecione as opções, se desejar. - (Opcional): marque a opção Include Import Statements para incluir as declarações de importação necessárias para o idioma selecionado. - (Opcional): marque a opção Include Driver Syntax para incluir o código específico do driver para: - Inicializar o cliente 
- Especifique o banco de dados e a coleção 
- Executar a operação de agregação 
 
- Copie o pipeline. - Clique no botão Copy no canto superior direito do pipeline para copiar o pipeline para o idioma selecionado na área de transferência. Cole o pipeline copiado em seu aplicativo. 
Exemplos
Os exemplos a seguir demonstram como usar os estágios $set, $replaceRoot e $addFields do aggregation pipeline para realizar atualizações.
updateOne com $set
Criar uma coleção de exemplo students (se a coleção não existir atualmente, inserir operações criará a coleção):
db.students.insertMany( [    { _id: 1, test1: 95, test2: 92, test3: 90, modified: new Date("01/05/2020") },    { _id: 2, test1: 98, test2: 100, test3: 102, modified: new Date("01/05/2020") },    { _id: 3, test1: 95, test2: 110, modified: new Date("01/04/2020") } ] ) 
Para verificar, faça a query da coleção:
db.students.find() 
A seguinte operação do db.collection.updateOne() utiliza um aggregation pipeline para atualizar o documento com _id: 3:
db.students.updateOne( { _id: 3 }, [ { $set: { "test3": 98, modified: "$$NOW"} } ] ) 
Especificamente, o pipeline consiste em um estágio $set que adiciona o campo test3 (e define seu valor para 98) ao documento e define o campo modified para o período atual. A operação utiliza a variável de agregação NOW para o período atual. Para acessar a variável, prefixo com $$ e entre aspas.
Para verificar a atualização, você pode fazer a query da coleção:
db.students.find().pretty() 
updateMany com $replaceRoot e $set
Criar uma coleção de exemplo students2 (se a coleção não existir atualmente, inserir operações criará a coleção):
db.students2.insertMany( [    { "_id" : 1, quiz1: 8, test2: 100, quiz2: 9, modified: new Date("01/05/2020") },    { "_id" : 2, quiz2: 5, test1: 80, test2: 89, modified: new Date("01/05/2020") }, ] ) 
Para verificar, faça a query da coleção:
db.students2.find() 
A operação db.collection.updateMany() a seguir usa um aggregation pipeline para padronizar os campos dos documentos (ou seja documentos na coleção devem ter os mesmos campos) e atualizar o campo modified:
db.students2.updateMany( {},   [     { $replaceRoot: { newRoot:        { $mergeObjects: [ { quiz1: 0, quiz2: 0, test1: 0, test2: 0 }, "$$ROOT" ] }     } },     { $set: { modified: "$$NOW"}  }   ] ) 
Especificamente, o pipeline consiste em:
- um estágio - $replaceRootcom uma expressão- $mergeObjectspara definir valores padrão para os campos- quiz1,- quiz2,- test1e- test2. A variável de agregação- ROOTrefere-se ao documento atual que está sendo modificado. Para acessar a variável, prefixo com- $$e entre aspas. Os campos do documento atual substituirão os valores padrão.
- um estágio - $setpara atualizar o campo- modifiedpara a data e hora atual. A operação usa a variável de agregação- NOWpara a data e hora atual. Para acessar a variável, prefixo com- $$e entre aspas.
Para verificar a atualização, você pode fazer a query da coleção:
db.students2.find() 
updateMany com $set
Criar uma coleção de exemplo students3 (se a coleção não existir atualmente, inserir operações criará a coleção):
db.students3.insertMany( [    { "_id" : 1, "tests" : [ 95, 92, 90 ], "modified" : ISODate("2019-01-01T00:00:00Z") },    { "_id" : 2, "tests" : [ 94, 88, 90 ], "modified" : ISODate("2019-01-01T00:00:00Z") },    { "_id" : 3, "tests" : [ 70, 75, 82 ], "modified" : ISODate("2019-01-01T00:00:00Z") } ] ); 
Para verificar, faça a query da coleção:
db.students3.find() 
A operação db.collection.updateMany() a seguir usa um aggregation pipeline para atualizar os documentos com a média de nota calculada e a nota de letra.
db.students3.updateMany(    { },    [      { $set: { average : { $trunc: [ { $avg: "$tests" }, 0 ] }, modified: "$$NOW" } },      { $set: { grade: { $switch: {                            branches: [                                { case: { $gte: [ "$average", 90 ] }, then: "A" },                                { case: { $gte: [ "$average", 80 ] }, then: "B" },                                { case: { $gte: [ "$average", 70 ] }, then: "C" },                                { case: { $gte: [ "$average", 60 ] }, then: "D" }                            ],                            default: "F"      } } } }    ] ) 
Especificamente, o pipeline consiste em:
- um estágio - $setpara calcular o valor médio truncado dos elementos da array- testse atualizar o campo- modifiedpara a data e hora atual. Para calcular a média truncada, o estágio utiliza as expressões- $avge- $trunc. A operação usa a variável de agregação- NOWpara a data/hora atual. Para acessar a variável, prefixo com- $$e entre aspas.
- um estágio - $setpara adicionar o campo- gradebaseado no- averageutilizando a expressão- $switch.
Para verificar a atualização, você pode fazer a query da coleção:
db.students3.find() 
updateOne com $set
Criar uma coleção de exemplo students4 (se a coleção não existir atualmente, inserir operações criará a coleção):
db.students4.insertMany( [   { "_id" : 1, "quizzes" : [ 4, 6, 7 ] },   { "_id" : 2, "quizzes" : [ 5 ] },   { "_id" : 3, "quizzes" : [ 10, 10, 10 ] } ] ) 
Para verificar, faça a query da coleção:
db.students4.find() 
A operação db.collection.updateOne() a seguir usa um aggregation pipeline para adicionar pontuações de questionário ao documento com _id:
2:
db.students4.updateOne( { _id: 2 },   [ { $set: { quizzes: { $concatArrays: [ "$quizzes", [ 8, 6 ]  ] } } } ] ) 
Para verificar a atualização, faça a query da coleção:
db.students4.find() 
updateMany com $addFields
Crie uma coleção de exemplo temperatures que contenha temperaturas em Celsius (se a coleção não existir no momento, as operações de inserção criarão a coleção):
db.temperatures.insertMany( [   { "_id" : 1, "date" : ISODate("2019-06-23"), "tempsC" : [ 4, 12, 17 ] },   { "_id" : 2, "date" : ISODate("2019-07-07"), "tempsC" : [ 14, 24, 11 ] },   { "_id" : 3, "date" : ISODate("2019-10-30"), "tempsC" : [ 18, 6, 8 ] } ] ) 
Para verificar, faça a query da coleção:
db.temperatures.find() 
A seguinte operação do db.collection.updateMany() utiliza um aggregation pipeline para atualizar os documentos com as temperaturas correspondentes em Fahrenheit:
db.temperatures.updateMany( { },   [     { $addFields: { "tempsF": {           $map: {              input: "$tempsC",              as: "celsius",              in: { $add: [ { $multiply: ["$$celsius", 9/5 ] }, 32 ] }           }     } } }   ] ) 
Especificamente, o pipeline consiste em um estágio $addFields para adicionar um novo campo de array tempsF que contém as temperaturas em Fahrenheit. Para converter cada temperatura celsius na array tempsC para Fahrenheit, o estágio utiliza a expressão $map com expressões $add e $multiply.
Para verificar a atualização, você pode fazer a query da coleção:
db.temperatures.find() 
Atualize com variáveis let
Novidades na versão 5.0.
Para definir variáveis que você possa acessar em outro lugar no comando, use a opção let.
Observação
Para filtrar resultados usando uma variável, você deve acessar a variável dentro do operador $expr.
Criar uma coleção cakeFlavors:
db.cakeFlavors.insertMany( [    { _id: 1, flavor: "chocolate" },    { _id: 2, flavor: "strawberry" },    { _id: 3, flavor: "cherry" } ] ) 
O seguinte comando do updateOne utiliza variáveis configuradas com a opção let :
- A variável - targetFlavorestá definida como- cherry. Essa variável é usada na expressão- $eqpara especificar o filtro de correspondência.
- A variável - newFlavorestá definida como- orange. Essa variável é usada no operador- $setpara especificar o valor- flavoratualizado para o documento correspondente.
db.cakeFlavors.updateOne(    {       $expr: { $eq: [ "$flavor", "$$targetFlavor" ] }    },    [       {          $set: { flavor: "$$newFlavor" }       }    ],    {       let: { targetFlavor: "cherry", newFlavor: "orange" }    } ) 
Depois de executar a operação de atualização anterior, a coleção cakeFlavors contém estes documentos:
[    { _id: 1, flavor: 'chocolate' },    { _id: 2, flavor: 'strawberry' },    { _id: 3, flavor: 'orange' } ] 
Exemplos adicionais
Consulte também as várias páginas do método de atualização para exemplos adicionais: