Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Menu Docs
Página inicial do Docs
/ /

$addFields (estágio de agregação )

$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 Expressões.

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.

Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.

A operação a seguir usa dois estágios$addFields para primeiro converter o tempo de execução em horas e, em seguida, calcular uma taxa de licenciamento de US$0.50 por hora:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: {
runtimeHours: {
$floor: { $divide: [ "$runtime", 60 ] }
},
ratingOutOf100: { $multiply: [ "$imdb.rating", 10 ] }
}
},
{
$addFields: {
licenseFeeUSD: {
$multiply: [ "$runtimeHours", 0.50 ]
}
}
}
] )
[
{ _id: ..., title: 'Baseball', runtime: 1140, runtimeHours: 19, licenseFeeUSD: 9.5 },
{ _id: ..., title: 'Centennial', runtime: 1256, runtimeHours: 20, licenseFeeUSD: 10 }
]
...

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

A seguinte operação de agregação adiciona um campo certified ao documento imdb incorporado em cada filme:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{ $addFields: { "imdb.certified": true } }
] )
[
{ _id: ..., title: 'Baseball', imdb: { certified: true, '...': '...' } },
{ _id: ..., title: 'Centennial', imdb: { certified: true, '...': '...' } }
]
...

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

A seguinte operação do $addFields substitui o campo runtime para adicionar 15 minutos:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: { runtime: { $add: [ "$runtime", 15 ] } }
}
] )
[
{ _id: ..., title: 'Baseball', runtime: 1155 },
{ _id: ..., title: 'Centennial', runtime: 1271 }
]
...

Você também pode substituir um campo por outro. A operação a seguir define _id para o título do filme e substitui o campo title pelo gênero principal do filme:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: {
_id: "$title",
title: { $arrayElemAt: [ "$genres", 0 ] }
}
}
] )
[
{ _id: 'Baseball', title: 'Documentary' },
{ _id: 'Centennial', title: 'Action' }
]
...

Você pode usar $addFields com uma expressão $concatArrays para adicionar um elemento a um campo de array existente. A operação a seguir anexa Epic à array genres de filmes com o título Centennial:

db.movies.aggregate( [
{ $match: { title: "Centennial" } },
{ $addFields: {
genres: {
$concatArrays: [ "$genres", [ "Epic" ] ]
}
} }
] )
[
{ _id: ..., title: 'Centennial', genres: [ 'Action', 'Adventure', 'Drama', 'Epic' ] }
]
...

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

A seguinte operação utiliza $addFields para remover o campo plot com a variável $$REMOVE:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: { plot: "$$REMOVE" }
}
] )
[
{ _id: ..., title: 'Baseball', runtime: 1140 },
{ _id: ..., title: 'Centennial', runtime: 1256 }
]
...

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

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields:
{
rated: {
$ifNull: [ "$rated", "$$REMOVE" ]
}
}
}
] )
[
{ _id: ..., title: 'Baseball', rated: 'TV-PG' },
{ _id: ..., title: 'Centennial' }
]
...

Os exemplos do Node.js nesta página utilizam o banco de dados do sample_mflix a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de exemplo, consulte Introdução na documentação do driver do MongoDB Node.js

Para usar o driver Node.js do MongoDB para adicionar um estágio $addFields a um pipeline de agregação , use o operador $addFields em um objeto de pipeline.

O exemplo a seguir cria um estágio de pipeline que adiciona um campo totalReviews a cada documento de filme , que contém o número total de avaliações do filme. Em seguida, o exemplo executa o agregação pipeline:

const pipeline = [
{
$addFields: {
totalReviews: {
$add: ["$imdb.votes", "$tomatoes.viewer.numReviews"]
}
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

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.

Para saber mais sobre os estágios de pipeline relacionados, consulte os guias $project e $set.

Voltar

Estágios de aggregation

Nesta página