Use agregação pipelines para realizar operações de atualização. Você pode criar e executar esses pipelines em:
Os pipelines de agregação para atualizações suportam estes estágios:
Os pipelines de agregação permitem atualizações expressivas, como:
Atualizações condicionais com base nos valores de campo atuais
Definindo valores de campo de outros campos
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 construir agregação pipelines para executar atualizações na UI do MongoDB Atlas . Exige função ou Project Data Access Read Only superior.
Abrir o Construtor de Pipeline de Agregação
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:
Configurar o estágio
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
Crie a coleção students:
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"} } ] )
O pipeline consiste em um estágio que adiciona $set o test3 campo (e define seu valor 98 para) ao documento e define o modified campo para o período atual. A operação utiliza a variável de agregação para o período atual. Para acessar a variável, prefixo NOW com $$ e entre aspas.
Para verificar, faça a query da coleção:
db.students.find().pretty()
updateMany com $replaceRoot e $set
Crie a coleção students2:
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"} } ] )
Esse pipeline consiste em:
um estágio
$replaceRootcom uma expressão$mergeObjectspara definir valores padrão para os camposquiz1,quiz2,test1etest2. A variável de agregaçãoROOTrefere-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 campomodifiedpara a data e hora atual. A operação usa a variável de agregaçãoNOWpara a data e hora atual. Para acessar a variável, prefixo com$$e entre aspas.
Para verificar, faça a query da coleção:
db.students2.find()
updateMany com $set
Crie a coleção students3:
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" } } } } ] )
Esse pipeline consiste em:
um estágio
$setpara calcular o valor médio truncado dos elementos da arraytestse atualizar o campomodifiedpara 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çãoNOWpara a data/hora atual. Para acessar a variável, prefixo com$$e entre aspas.um estágio
$setpara adicionar o campogradebaseado noaverageutilizando a expressão$switch.
Para verificar, faça a query da coleção:
db.students3.find()
updateOne com $set
Crie a coleção students4:
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, faça a query da coleção:
db.students4.find()
updateMany com $addFields
Crie a coleção temperatures usando temperaturas em Celsius:
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 ] } } } } } ] )
O pipeline consiste em um estágio para adicionar um novo campo de $addFields array tempsF que contém as temperaturas em Fahrenheit. Para converter cada temperatura celsius tempsC na array para Fahrenheit, o estágio utiliza a $map expressão $add $multiply com expressões e.
Para verificar, faça 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 comocherry. Essa variável é usada na expressão$eqpara especificar o filtro de correspondência.A variável
newFlavorestá definida comoorange. Essa variável é usada no operador$setpara especificar o valorflavoratualizado 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 as páginas a seguir para mais exemplos: