Definição
$addFieldsAdiciona novos campos aos documentos.
$addFieldsgera 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$projectque 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.
Compatibilidade
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
Sintaxe
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.
Comportamento
$addFieldsanexa novos campos a documentos existentes. Você pode incluir um ou mais estágios$addFieldsem uma operação de aggregation.$addFieldsaceita 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.
Exemplos
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.
Usando dois estágios $addFields
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 } ] ...
Adicionando campos a um documento incorporado
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, '...': '...' } } ] ...
Substituindo um campo existente
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' } ] ...
Adicionar Elemento a uma Array
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' ] } ] ...
removeFields
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.
Saiba mais
Para saber mais sobre os estágios de pipeline relacionados, consulte os guias $project e $set.