Definição
Observação
Desambiguação
$setAdiciona novos campos aos documentos.
$setgera 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
$projectque 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 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), $set sobrescreve o valor existente desse campo com o valor da expressão especificada.
Comportamento
$setanexa novos campos a documentos existentes. Você pode incluir um ou mais estágios$setem uma operação de agregação.$setaceita 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:{$set: { 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
$set, 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 $set
A operação a seguir usa dois estágios $set para incluir três novos campos nos documentos de saída:
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { imdbScoreScaled: { $multiply: [ "$imdb.rating", 10 ] }, runtimeHours: { $floor: { $divide: [ "$runtime", 60 ] } } } }, { $set: { totalScore: { $add: [ "$imdbScoreScaled", "$runtimeHours" ] } } } ] )
[ { _id: ..., title: 'Baseball', runtime: 1140, imdbScoreScaled: 91, runtimeHours: 19, totalScore: 110 }, { _id: ..., title: 'Centennial', runtime: 1256, imdbScoreScaled: 85, runtimeHours: 20, totalScore: 105 } ] ...
- Primeiro estágio (
$set): - O primeiro estágio adiciona dois
$setcampos:,imdbScoreScaledque multiplica a classificação do IMDB10por, e,runtimeHoursque divide o tempo de execução por60e arredonda para baixo para o número inteiro mais próximo. - Segundo estágio (
$set): - O segundo
$setestágiototalScoreadiciona, que somaimdbScoreScalederuntimeHourscalculados no estágio anterior.
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 novo campo normalizedRating ao documento incorporado imdb:
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { "imdb.normalizedRating": { $multiply: [ "$imdb.rating", 10 ] } } } ] )
[ { _id: ..., title: 'Baseball', imdb: { '...': '...', normalizedRating: 91 } }, { _id: ..., title: 'Centennial', imdb: { '...': '...', normalizedRating: 85 } } ] ...
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.
A seguinte operação $set substitui o campo rated:
db.movies.aggregate( [ { $match: { title: "Baseball" } }, { $set: { rated: "UNRATED" } } ] )
[ { _id: ..., title: 'Baseball', rated: 'UNRATED' } ] ...
É possível substituir um campo por outro. No exemplo a seguir, o campo title substitui o campo _id.
A seguinte operação de agregação utiliza $set para substituir o campo _id de cada documento pelo valor do campo title e substitui o campo title pela string "movie":
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { _id: "$title", title: "movie" } } ] )
[ { _id: 'Baseball', title: 'movie' }, { _id: 'Centennial', title: 'movie' } ] ...
Adicionar Elemento a uma Array
Você pode usar$setcom uma expressão$concatArrayspara adicionar um elemento a um campo de array existente. A operação a seguir usa$setpara substituir o campo genres por uma nova array cujos elementos são a array genres atual concatenada com outra array contendo um novo gênero [ "Classic" ]:
db.movies.aggregate( [ { $match: { title: "Baseball" } }, { $set: { genres: { $concatArrays: [ "$genres", [ "Classic" ] ] } } } ] )
[ { _id: ..., title: 'Baseball', genres: [ 'Documentary', 'History', 'Sport', 'Classic' ] } ] ...
Criando um novo campo com campos existentes
A seguinte operação de agregação adiciona um novo campo titleWithYear a cada documento que concatena o título do filme com seu ano de lançamento:
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { titleWithYear: { $concat: [ "$title", " (", { $toString: "$year" }, ")" ] } } } ] )
[ { _id: ..., title: 'Baseball', titleWithYear: 'Baseball (1994)' }, { _id: ..., title: 'Centennial', titleWithYear: 'Centennial (1978)' } ] ...
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 string Title { get; set; } = null!; [] public int? Year { get; set; } [] public int? Runtime { get; set; } [] public string? Rated { get; set; } [] public int Metacritic { get; set; } [] public string? Plot { get; set; } [] public string? Type { get; set; } [] public string[]? Cast { get; set; } [] public string[]? Directors { get; set; } [] public string[]? Writers { get; set; } [] public ImdbData? Imdb { get; set; } }
Para usar o driver MongoDB .NET/C# para adicionar um estágio $set a um pipeline de agregação, chame o método Set() em um objeto PipelineDefinition.
O exemplo a seguir cria um estágio de pipeline que corresponde ao documento Movie com o título "The Godfather" e define seu campo Rated como "UNRATED":
var pipeline = new EmptyPipelineDefinition<Movie>() .Match(Builders<Movie>.Filter.Eq(m => m.Title, "The Godfather")) .Set(Builders<Movie>.SetFields.Set(m => m.Rated, "UNRATED"));
{ "_id" : "...", "title" : "The Godfather", "runtime" : 175, "rated" : "UNRATED", "metacritic" : 100 }
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 como o valor do objeto Date. O exemplo em seguida executa o pipeline de agregação:
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.