Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

$set (fase de agregación)

Nota

Desambiguación

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

$set

Agrega nuevos campos a los documentos. $set genera documentos que contienen todos los campos existentes de los documentos de entrada y los nuevos campos.

La etapa $set 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.

Importante

Si el nombre del nuevo campo coincide con un nombre de campo existente (incluido _id), $set sobrescribe el valor de ese campo con la expresión especificada.

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

  • Puedes usar $set con objetos anidados. Puedes asignar 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 documentos en matrices), utilice la notación de puntos. Vea el ejemplo.

  • Para agregar un elemento a un campo de matriz existente con $set, use $concatArrays. Vea 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 etapas $set 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 $set agrega dos campos: imdbScoreScaled, que multiplica la calificación de IMDB por 10, y runtimeHours, que divide la duració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 agrega 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 } }
]
...

La siguiente operación $set sobrescribe el campo rated:

db.movies.aggregate( [
{ $match: { title: "Baseball" } },
{ $set: { rated: "UNRATED" } }
] )
[
{ _id: ..., title: 'Baseball', rated: 'UNRATED' }
]
...

Puedes reemplazar un campo por otro. La siguiente operación reemplaza _id con el valor del campo title y luego establece title a la cadena "movie":

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{ $set: { _id: "$title", title: "movie" } }
] )
[
{ _id: 'Baseball', title: 'movie' },
{ _id: 'Centennial', title: 'movie' }
]
...

Para agregar un elemento a un campo de matriz existente, use $concatArrays con $set. La siguiente operación reemplaza el campo genres con una nueva matriz que concatena la matriz genres actual con [ "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 agrega un nuevo campo titleWithYear a cada documento que concatena el título de la película con su año de lanzamiento:

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 controlador MongoDB.NET/C# para agregar una $set etapa a una canalización de agregación, llame al método UnionWith() en un PipelineDefinition objeto.

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"));

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 etapas relacionadas, consulte $addFields.