Menu Docs
Página inicial do Docs
/ /

Atualizações com pipeline de agregação

Use agregação pipelines para realizar operações de atualização. Você pode criar e executar esses pipelines em:

  • MongoDB Atlas

  • MongoDB Compass

  • MongoDB Shell

  • Drivers

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" } } } ] )

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.

1
  1. Selecione o banco de dados para a collection.

    O painel principal e Namespaces no lado esquerdo listam as coleções no banco de dados.

  2. 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.

  3. Selecione a visualização Agregação.

    Quando abre pela primeira vez a vista Aggregation , Atlas exibe um pipeline de agregação vazio.

2
  1. 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:

  2. 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.

3
  1. Clique em Exportar para Idioma.

    Você pode encontrar este botão na parte superior do construtor de pipeline.

  2. 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.

  3. 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

  4. 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.

Os exemplos a seguir demonstram como usar os estágios $set, $replaceRoot e $addFields do aggregation pipeline para realizar atualizações.

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()

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 $replaceRoot com uma expressão $mergeObjects para definir valores padrão para os campos quiz1, quiz2, test1 e test2. A variável de agregação ROOT 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 campo modified para a data e hora atual. A operação usa a variável de agregação NOW para 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()

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 $set para calcular o valor médio truncado dos elementos da array tests e atualizar o campo modified 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ção NOW para a data/hora atual. Para acessar a variável, prefixo com $$ e entre aspas.

  • um estágio $set para adicionar o campo grade baseado no average utilizando a expressão $switch.

Para verificar, faça a query da coleção:

db.students3.find()

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()

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()

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 como cherry. Essa variável é usada na expressão $eq para especificar o filtro de correspondência.

  • A variável newFlavor está definida como orange. Essa variável é usada no operador $set para especificar o valor flavor 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' }
]

Consulte as páginas a seguir para mais exemplos:

Voltar

Update

Nesta página