Docs Menu
Docs Home
/ /

$set (fase de agregación)

Nota

Desambiguación

La siguiente página hace referencia a la etapa de agregación $set. Para el operador de actualización $set, ver $set.

$set

Agrega nuevos campos a los documentos. $set produce documentos que contienen todos los campos existentes de los documentos de entrada y los campos recién añadidos.

La $set etapa es un alias de $addFields.

Ambas etapas son equivalentes a una $project etapa que especifica explícitamente todos los campos existentes en los documentos de entrada y agrega los nuevos campos.

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.

$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.

  • $set añade nuevos campos a documentos existentes. Puedes incluir una o más etapas $set en una operación de agregación.

  • $set acepta 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.

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.

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 $set campos:, imdbScoreScaled que multiplica la calificación de IMDB 10 por, y,runtimeHours que divide el tiempo de ejecución por 60 y ​​redondea hacia abajo al entero más cercano.
Segunda etapa ($set):
La segunda etapa $set agrega,totalScore que suma imdbScoreScaled y runtimeHours calculados en la etapa anterior.

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 } }
]
...

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' }
]
...

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' ] }
]
...

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:

[BsonIgnoreExtraElements]
public class Movie
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("title")]
public string Title { get; set; } = null!;
[BsonElement("year")]
public int? Year { get; set; }
[BsonElement("runtime")]
public int? Runtime { get; set; }
[BsonElement("rated")]
public string? Rated { get; set; }
[BsonElement("metacritic")]
public int Metacritic { get; set; }
[BsonElement("plot")]
public string? Plot { get; set; }
[BsonElement("type")]
public string? Type { get; set; }
[BsonElement("cast")]
public string[]? Cast { get; set; }
[BsonElement("directors")]
public string[]? Directors { get; set; }
[BsonElement("writers")]
public string[]? Writers { get; set; }
[BsonElement("imdb")]
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;

Para aprender más sobre las etapas relacionadas del pipeline, consulta la guía $addFields.

Volver

$searchMeta

En esta página