Definição
Observação
Desambiguação
A página a seguir se refere ao estágio de agregação $set
. Para o operador de atualização $set
,$set
consulte.
$set
Adiciona novos campos aos documentos.
$set
gera documentos que contêm todos os campos existentes dos documentos de entrada e novos campos adicionados.O estágio
$set
é um alias para$addFields
.Ambos os estágios são equivalentes a um estágio
$project
que especifica explicitamente todos os campos existentes nos documentos de entrada e adiciona os novos campos.
Compatibilidade
Você pode utilizar o $set
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
$set
tem o seguinte formato:
{ $set: { <newField>: <expression>, ... } }
Especifique o nome de cada campo para adicionar e definir seu valor para uma expressão de agregação. 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
), $set
sobrescreve o valor existente desse campo com o valor da expressão especificada.
Comportamento
$set
anexa novos campos a documentos existentes. Você pode incluir um ou mais estágios $set
em uma operação de agregação.
Para adicionar 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 $set
, utilize com $concatArrays
. Veja o exemplo.
Exemplos
Usando dois $set
estágios
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 } ] )
A operação a seguir usa dois estágios $set
para incluir três novos campos nos documentos de saída:
db.scores.aggregate( [ { $set: { totalHomework: { $sum: "$homework" }, totalQuiz: { $sum: "$quiz" } } }, { $set: { 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 } ]
Adicionando campos a um documento incorporado
Use a notação de pontos para adicionar novos campos a documentos incorporados.
Crie uma collection de amostra vehicles
com o seguinte:
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( [ { $set: { "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" } } ]
Substituindo um campo existente
A especificação de um nome de campo existente em uma operação $set
faz com que o campo original seja substituído.
Crie uma collection de amostra chamada animals
com o seguinte:
db.animals.insertOne( { _id: 1, dogs: 10, cats: 15 } )
A seguinte operação $set
substitui o campo cats
:
db.animals.aggregate( [ { $set: { 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
.
Crie uma collection de amostra chamada fruits
que contém os seguintes documentos:
db.fruits.insertMany( [ { _id: 1, item: "tangerine", type: "citrus" }, { _id: 2, item: "lemon", type: "citrus" }, { _id: 3, item: "grapefruit", type: "citrus" } ] )
A operação de aggregation seguinte utiliza $set
para substituir o campo _id
de cada documento pelo valor do campo item
e substitui o campo item
por uma string "fruit"
.
db.fruits.aggregate( [ { $set: { _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" } ]
Adicionar Elemento a uma Array
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 $set
com uma expressão $concatArrays
para adicionar um elemento a um campo de array existente. Por exemplo, a seguinte operação usa $set
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 } }, { $set: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } } ] )
A operação retorna o seguinte:
[ { _id: 1, student: "Maya", homework: [ 10, 5, 10, 7 ], quiz: [ 10, 8 ], extraCredit: 0 } ]
Criando um novo campo com campos existentes
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 } ] )
A seguinte operação de aggregation adiciona um novo campo quizAverage
a cada documento que contém a média da array quiz
.
db.scores.aggregate( [ { $set: { quizAverage: { $avg: "$quiz" } } } ] )
A operação retorna os seguintes documentos:
[ { _id: 1, student: 'Maya', homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0, quizAverage: 9 }, { _id: 2, student: 'Ryan', homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8, quizAverage: 8 } ]
Os exemplos de C# nesta página utilizam o banco de dados sample_mflix
a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de exemplo, consulte Introdução na documentação do driver MongoDB .NET/C#.
A seguinte classe Movie
modela os documentos na collection sample_mflix.movies
:
public class Movie { public ObjectId Id { get; set; } public int Runtime { get; set; } public string Title { get; set; } public string Rated { get; set; } public List<string> Genres { get; set; } public string Plot { get; set; } public ImdbData Imdb { get; set; } public int Year { get; set; } public int Index { get; set; } public string[] Comments { get; set; } [ ] public DateTime LastUpdated { get; set; } }
Observação
ConventionPack para Pascal Case
As classes C# nesta página usam Pascal case para seus nomes de propriedade, mas os nomes de campo na coleção MongoDB usam Camel case. Para considerar essa diferença, você pode usar o seguinte código para registrar um ConventionPack
quando o aplicativo iniciar:
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
Para usar o driver MongoDB .NET/C# para adicionar um $set
estágio a um pipeline de agregação , chame o método Set() em um PipelineDefinition
objeto.
O exemplo a seguir cria um estágio de pipeline que define o valor do campo LastUpdated
em cada documento Movie
para o valor de DateTime.Now
:
var pipeline = new EmptyPipelineDefinition<Movie>() .Set(Builders<Movie>.SetFields.Set(m => m.LastUpdated, DateTime.Now));
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 $set
a um pipeline de agregação , use o operador $set
em um objeto de pipeline.
O exemplo a seguir cria um estágio de pipeline que define o valor do campo lastupdated
em cada documento movie
para o valor do objeto Date
. Em seguida, o exemplo executa o agregação pipeline:
const pipeline = [{ $set: { lastupdated: new Date() } }]; const cursor = collection.aggregate(pipeline); return cursor;
Saiba mais
Para saber mais sobre os estágios de pipeline relacionados, consulte o guia$addFields
.