Definición
Nota
Desambiguación
$setAgrega nuevos campos a los documentos.
$setproduce documentos que contienen todos los campos existentes de los documentos de entrada y los campos recién añadidos.La
$setetapa es un alias de$addFields.Ambas etapas son equivalentes a una
$projectetapa que especifica explícitamente todos los campos existentes en los documentos de entrada y agrega los nuevos campos.
Compatibilidad
Puedes usar $set para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
$set tiene la siguiente forma:
{ $set: { <newField>: <expression>, ... } }
Especifique el nombre de cada campo para agregar y establezca su valor en una expresión de agregación o un objeto vacío. Para obtener más información sobre las expresiones, consulte las Expresiones.
Importante
Si el nombre del nuevo campo es el mismo que el de un campo existente (incluido _id), $set sobrescribirá el valor existente de ese campo con el valor de la expresión especificada.
Comportamiento
$setañade nuevos campos a documentos existentes. Puedes incluir una o más etapas$seten una operación de agregación.$setacepta la incrustación de objetos donde se puede establecer un valor a una expresión de agregación o a un objeto vacío. Por ejemplo, se aceptan los siguientes objetos anidados:{$set: { a: { b: { } } } } Para agregar campos a documentos incrustados (incluidos los documentos en arreglos) utiliza la notación de puntos. Consulta el ejemplo.
Para agregar un elemento a un campo de arreglo existente con
$set, úsalo con$concatArrays. Consulta el ejemplo.
Ejemplos
Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Uso de dos etapas de $set
La siguiente operación utiliza dos $set etapas para incluir tres nuevos campos en los documentos de salida:
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 } ] ...
- Primera etapa (
$set): - La primera etapa agrega dos
$setcampos:,imdbScoreScaledque multiplica la calificación de IMDB10por, y,runtimeHoursque divide el tiempo de ejecución por60y redondea hacia abajo al entero más cercano. - Segunda etapa (
$set): - La segunda etapa
$setagrega,totalScoreque sumaimdbScoreScaledyruntimeHourscalculados en la etapa anterior.
Agregar campos a un documento incrustado
Utilice la notación de puntos para agregar nuevos campos a los documentos incrustados.
La siguiente operación de agregación añade un nuevo campo normalizedRating al documento incrustado 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 } } ] ...
Sobrescribir un campo existente
Al especificar un nombre de campo existente en una operación de $set, se reemplaza el campo original.
La siguiente operación $set sobrescribe el campo rated:
db.movies.aggregate( [ { $match: { title: "Baseball" } }, { $set: { rated: "UNRATED" } } ] )
[ { _id: ..., title: 'Baseball', rated: 'UNRATED' } ] ...
Es posible reemplazar un campo por otro. En el siguiente ejemplo, el campo title sustituye al campo _id.
La siguiente operación de agregación utiliza $set para reemplazar el campo _id de cada documento con el valor del campo title y reemplaza el campo title con la cadena "movie":
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { _id: "$title", title: "movie" } } ] )
[ { _id: 'Baseball', title: 'movie' }, { _id: 'Centennial', title: 'movie' } ] ...
Agrega el elemento a un arreglo
Puedes usar$setcon una expresión$concatArrayspara agregar un elemento a un campo de matriz existente. La siguiente operación usa$setpara reemplazar el campo genres con una nueva matriz cuyos elementos son la matriz genres actual concatenada con otra matriz que contiene un nuevo género [ "Classic" ]:
db.movies.aggregate( [ { $match: { title: "Baseball" } }, { $set: { genres: { $concatArrays: [ "$genres", [ "Classic" ] ] } } } ] )
[ { _id: ..., title: 'Baseball', genres: [ 'Documentary', 'History', 'Sport', 'Classic' ] } ] ...
Creación de un nuevo campo con campos existentes
La siguiente operación de agregación añade un nuevo campo titleWithYear a cada documento que concatena el título de la película con su año de estreno:
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)' } ] ...
Los ejemplos de C# en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Primeros pasos en la documentación del controlador de MongoDB .NET/C#.
La siguiente clase Movie modela los documentos en la colección 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 el driver MongoDB .NET/C# para agregar una etapa $set a un pipeline de agregación, llama a la Set() método en un objeto PipelineDefinition.
El siguiente ejemplo crea una etapa de pipeline que coincide con el Movie documento con el título "The Godfather" y establece su campo Rated en "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 }
Los ejemplos de Node.js en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Primeros pasos en la documentación del controlador de MongoDB Node.js.
Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $set a una canalización de agregación, utilice el Operador $set en un objeto de canalización.
El siguiente ejemplo crea una etapa de pipeline que asigna el valor del campo lastupdated en cada documento movie al valor del objeto Date. A continuación, el ejemplo ejecuta el pipeline de agregación:
const pipeline = [{ $set: { lastupdated: new Date() } }]; const cursor = collection.aggregate(pipeline); return cursor;
Obtén más información
Para aprender más sobre las etapas relacionadas del pipeline, consulta la guía $addFields.