Docs Menu
Docs Home
/ /

$set (fase de agregación)

Nota

Desambiguación

La siguiente página se refiere a la etapa de agregación. $set. Para el operador de actualización $set,$set véase.

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

Cree una colección de muestra scores con lo siguiente:

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

La siguiente operación utiliza dos $set etapas para incluir tres nuevos campos en los documentos de salida:

db.scores.aggregate( [
{
$set: {
totalHomework: { $sum: "$homework" },
totalQuiz: { $sum: "$quiz" }
}
},
{
$set: {
totalScore: { $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }
}
] )

La operación devuelve los siguientes 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
}
]

Utilice la notación de puntos para agregar nuevos campos a los documentos incrustados.

Crea una colección de muestra vehicles con lo siguiente:

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" }
] )

La siguiente operación de agregación agrega un nuevo campo fuel_type al documento incrustado specs.

db.vehicles.aggregate( [
{ $set: { "specs.fuel_type": "unleaded" } }
] )

La operación devuelve los siguientes 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" } }
]

Al especificar un nombre de campo existente en una operación de $set, se reemplaza el campo original.

Cree una colección de muestra llamada animals con lo siguiente:

db.animals.insertOne( { _id: 1, dogs: 10, cats: 15 } )

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

db.animals.aggregate( [
{ $set: { cats: 20 } }
] )

La operación devuelve el siguiente documento:

[ { _id: 1, dogs: 10, cats: 20 } ]

Es posible reemplazar un campo por otro. En el siguiente ejemplo, el campo item sustituye al campo _id.

Crea una colección de muestra llamada fruits que contenga los siguientes documentos:

db.fruits.insertMany( [
{ _id: 1, item: "tangerine", type: "citrus" },
{ _id: 2, item: "lemon", type: "citrus" },
{ _id: 3, item: "grapefruit", type: "citrus" }
] )

La siguiente operación de agregación utiliza $set para reemplazar el campo _id de cada documento con el valor del campo item, y reemplaza el campo item con una string "fruit".

db.fruits.aggregate( [
{ $set: { _id: "$item", item: "fruit" } }
] )

La operación devuelve lo siguiente:

[
{ _id: "tangerine", item: "fruit", type: "citrus" },
{ _id: "lemon", item: "fruit", type: "citrus" },
{ _id: "grapefruit", item: "fruit", type: "citrus" }
]

Cree una colección de muestra scores con lo siguiente:

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

Puedes usar $set con una expresión $concatArrays para agregar un elemento a un campo de arreglo existente. Por ejemplo, la siguiente operación usa $set para reemplazar el campo homework con un nuevo arreglo cuyos elementos son el arreglo actual homework concatenado con otro arreglo que contiene una nueva puntuación [ 7 ].

db.scores.aggregate( [
{ $match: { _id: 1 } },
{ $set: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
] )

La operación devuelve lo siguiente:

[ { _id: 1, student: "Maya", homework: [ 10, 5, 10, 7 ], quiz: [ 10, 8 ], extraCredit: 0 } ]

Cree una colección de muestra scores con lo siguiente:

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

La siguiente operación de agregación añade un nuevo campo quizAverage a cada documento que contiene el promedio del arreglo quiz.

db.scores.aggregate( [
{
$set: {
quizAverage: { $avg: "$quiz" }
}
}
] )

La operación devuelve los siguientes 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
}
]

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 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; }
[BsonElement("lastupdated")]
public DateTime LastUpdated { get; set; }
}

Nota

ConventionPack para Pascal Case

Las clases de C# en esta página utilizan Pascal case para los nombres de sus propiedades, pero los nombres de los campos en la colección de MongoDB utilizan camel case. Para tener en cuenta esta diferencia, se puede usar el siguiente código para registrar un ConventionPack cuando la aplicación se inicie:

var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);

Para usar el controlador MongoDB.NET/C# para agregar una $set etapa a una canalización de agregación, llame a Set()método en un PipelineDefinition objeto.

El siguiente ejemplo crea una etapa de pipeline que establece el valor del campo LastUpdated en cada documento Movie al valor de DateTime.Now:

var pipeline = new EmptyPipelineDefinition<Movie>()
.Set(Builders<Movie>.SetFields.Set(m => m.LastUpdated, DateTime.Now));

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