Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$addFields (agregação)

Nesta página

  • Definição
  • Compatibilidade
  • Sintaxe
  • Comportamento
  • Exemplos
$addFields

Adiciona novos campos aos documentos. $addFields gera documentos que contêm todos os campos existentes dos documentos de entrada e novos campos adicionados.

O estágio $addFields é equivalente a um estágio $project que especifica explicitamente todos os campos existentes nos documentos de entrada e adiciona os novos campos.

Observação

Você também pode usar o estágio $set, que é um alias para $addFields.

Você pode utilizar o $addFields para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem

  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

O estágio tem a seguinte sintaxe:

{ $addFields: { <newField>: <expression>, ... } }

Especifique o nome de cada campo a ser adicionado e defina seu valor como uma expressão de agregação ou um objeto vazio. Para mais informações sobre expressões, consulte Operadores de Expressão.

Importante

Se o nome do novo campo for o mesmo de um nome de campo existente (incluindo _id), $addFields sobrescreve o valor existente desse campo com o valor da expressão especificada.

  • $addFields anexa novos campos a documentos existentes. Você pode incluir um ou mais estágios $addFields em uma operação de aggregation.

  • $addFields aceita a incorporação de objetos onde você pode definir um valor para uma expressão de agregação ou para um objeto vazio. Por exemplo, os seguintes objetos aninhados são aceitos:

    {$addFields: { a: { b: { } } } }

    Para adicionar um campo ou campos a documentos incorporados (incluindo documentos em matrizes), use a notação de ponto. Consulte o exemplo.

  • Para adicionar um elemento a um campo de array existente com $addFields, utilize com $concatArrays. Veja o exemplo.

Uma coleção chamada scores contém os seguintes documentos:

db.scores.insertMany( [
{
_id: 1,
student: "Maya",
homework: [ 10, 5, 10 ],
quiz: [ 10, 8 ],
extraCredit: 0
},
{
_id: 2,
student: "Ryan",
homework: [ 5, 6, 5 ],
quiz: [ 8, 8 ],
extraCredit: 8
}
] )

A operação a seguir usa dois estágios $addFields para incluir três novos campos nos documentos de saída:

db.scores.aggregate( [
{
$addFields: {
totalHomework: { $sum: "$homework" } ,
totalQuiz: { $sum: "$quiz" }
}
},
{
$addFields: { totalScore:
{ $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }
}
] )

A operação retorna os seguintes documentos:

[
{
_id: 1,
student: "Maya",
homework: [ 10, 5, 10 ],
quiz: [ 10, 8 ],
extraCredit: 0,
totalHomework: 25,
totalQuiz: 18,
totalScore: 43
},
{
_id: 2,
student: "Ryan",
homework: [ 5, 6, 5 ],
quiz: [ 8, 8 ],
extraCredit: 8,
totalHomework: 16,
totalQuiz: 16,
totalScore: 40
}
]

Use a notação de pontos para adicionar novos campos a documentos incorporados.

Por exemplo, crie uma collection chamada vehicles com os seguintes documentos:

db.vehicles.insertMany( [
{ _id: 1, type: "car", specs: { doors: 4, wheels: 4 } },
{ _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2 } },
{ _id: 3, type: "jet ski" }
] )

A seguinte operação de agregação adiciona um novo campo fuel_type ao documento incorporado specs.

db.vehicles.aggregate( [
{ $addFields: { "specs.fuel_type": "unleaded" } }
] )

A operação retorna os seguintes resultados:

[
{ _id: 1, type: "car",
specs: { doors: 4, wheels: 4, fuel_type: "unleaded" } },
{ _id: 2, type: "motorcycle",
specs: { doors: 0, wheels: 2, fuel_type: "unleaded" } },
{ _id: 3, type: "jet ski",
specs: { fuel_type: "unleaded" } }
]

A especificação de um nome de campo existente em uma operação $addFields faz com que o campo original seja substituído.

Uma coleção chamada animals contém o seguinte documento:

db.animals.insertOne(
{ _id: 1, dogs: 10, cats: 15 }
)

A seguinte operação $addFields especifica o campo cats.

db.animals.aggregate( [
{
$addFields: { cats: 20 }
}
] )

A operação retorna o seguinte documento:

[ { _id: 1, dogs: 10, cats: 20 } ]

É possível substituir um campo por outro. No exemplo a seguir, o campo item substitui o campo _id.

Uma coleção chamada fruit contém os seguintes documentos:

db.fruit.insertMany( [
{ _id: 1, item: "tangerine", type: "citrus" },
{ _id: 2, item: "lemon", type: "citrus" },
{ _id: 3, item: "grapefruit", type: "citrus" }
] )

A operação de agregação seguinte usa $addFields para substituir o campo _id de cada documento pelo valor do campo item e substitui o campo item por um valor estático.

db.fruit.aggregate( [
{
$addFields: {
_id : "$item",
item: "fruit"
}
}
] )

A operação retorna o seguinte:

[
{ _id: "tangerine", item: "fruit", type: "citrus" },
{ _id: "lemon", item: "fruit", type: "citrus" },
{ _id: "grapefruit", item: "fruit", type: "citrus" }
]

Crie uma coleção de amostra scores com o seguinte:

db.scores.insertMany( [
{ _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 },
{ _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 }
] )

Você pode usar $addFields com uma expressão $concatArrays para adicionar um elemento a um campo de array existente. Por exemplo, a seguinte operação usa $addFields para substituir o campo homework por uma nova array cujos elementos são a array homework atual concatenada com outra array contendo uma nova pontuação [ 7 ].

db.scores.aggregate( [
{ $match: { _id: 1 } },
{ $addFields: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
] )

A operação retorna o seguinte:

[ { _id: 1, student: "Maya", homework: [ 10, 5, 10, 7 ], quiz: [ 10, 8 ], extraCredit: 0 } ]

Você pode usar $addFields com a variável $$REMOVE para remover campos do documento.

Por exemplo, crie uma coleção labReadings:

db.labReadings.insertMany( [
{
date: ISODate("2024-10-09"),
temperature: 80
},
{
date: null,
temperature: 83
},
{
date: ISODate("2024-12-09"),
temperature: 85
}
] )

Para remover o campo date dos documentos labReadings, use $addFields com a variável $$REMOVE:

db.labReadings.aggregate( [
{
$addFields: { date: "$$REMOVE" }
}
] )

Saída:

[
{ _id: ObjectId('671285306fd2c3b24f2e7eaa'), temperature: 80 },
{ _id: ObjectId('671285306fd2c3b24f2e7eab'), temperature: 83 },
{ _id: ObjectId('671285306fd2c3b24f2e7eac'), temperature: 85 }
]

Você também pode usar $$REMOVE para remover campos condicional. Por exemplo, a seguinte agregação remove o campo date dos documentos em que date é null:

db.labReadings.aggregate( [
{
$addFields:
{
date: {
$ifNull: [ "$date", "$$REMOVE" ]
}
}
}
] )

Saída:

[
{
_id: ObjectId('671285306fd2c3b24f2e7eaa'),
date: ISODate('2024-10-09T00:00:00.000Z'),
temperature: 80
},
{ _id: ObjectId('671285306fd2c3b24f2e7eab'), temperature: 83 },
{
_id: ObjectId('671285306fd2c3b24f2e7eac'),
date: ISODate('2024-12-09T00:00:00.000Z'),
temperature: 85
}
]

Dica

Comparação com $project

Você pode usar o estágio $addFields ou $project para remover campos do documento. A melhor abordagem depende do seu pipeline e de quanto do documento original você deseja manter.

Para um exemplo usando $$REMOVE em um estágio $project, consulte Excluir campos condicionalmente.

Voltar

Estágios