Atualizações com pipeline de agregação
Nesta página
- Criar um Aggregation Pipeline de Atualização no Atlas
- Acessar o Construtor de Aggregation Pipeline.
- Crie um aggregation pipeline para realizar atualizações.
- Exporte o aggregation pipeline.
- Exemplos
- updateOne com $set
- updateMany com $replaceRoot e $set
- updateMany com $set
- updateOne com $set
- updateMany com $addFields
- Atualize com variáveis let
- Exemplos adicionais
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).
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
$replaceRoot
com uma expressão$mergeObjects
para definir valores padrão para os camposquiz1
,quiz2
,test1
etest2
. A variável de agregaçãoROOT
refere-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
$set
para atualizar o campomodified
para a data e hora atual. A operação usa a variável de agregaçãoNOW
para 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
$set
para calcular o valor médio truncado dos elementos da arraytests
e atualizar o campomodified
para a data e hora atual. Para calcular a média truncada, o estágio utiliza as expressões$avg
e$trunc
. A operação usa a variável de agregaçãoNOW
para a data/hora atual. Para acessar a variável, prefixo com$$
e entre aspas.um estágio
$set
para adicionar o campograde
baseado noaverage
utilizando 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
targetFlavor
está definida comocherry
. Essa variável é usada na expressão$eq
para especificar o filtro de correspondência.A variável
newFlavor
está definida comoorange
. Essa variável é usada no operador$set
para especificar o valorflavor
atualizado 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: