Docs Menu
Docs Home
/ /
Etapas de la pipeline de agregación

$addFields (etapa de agregación)

$addFields

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

La etapa es equivalente a $addFields una $project etapa que especifica explícitamente todos los campos existentes en los documentos de entrada y agrega los nuevos campos.

Nota

También puedes usar la etapa $set, que es un alias de $addFields.

Puedes usar $addFields 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.

$addFields tiene la siguiente forma:

{ $addFields: { <newField>: <expression>, ... } }

Especifique el nombre de cada campo que se agregará y asigne su valor a una expresión de agregación. Para obtener más información sobre expresiones, consulte Expresiones.

Importante

Si el nombre del nuevo campo es el mismo que el de un campo existente (incluido _id), $addFields sobrescribirá el valor existente de ese campo con el valor de la expresión especificada.

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

Para añadir uno o más campos a documentos incrustados (incluidos los documentos en matrices), utilice la notación de punto. Vea el ejemplo.

Para agregar un elemento a un campo de arreglo existente con $addFields, úsalo con $concatArrays. Consulta el ejemplo.

Una colección llamada scores contiene los siguientes documentos:

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 $addFields etapas para incluir tres nuevos campos en los documentos de salida:

db.scores.aggregate( [
{
$addFields: {
totalHomework: { $sum: "$homework" } ,
totalQuiz: { $sum: "$quiz" }
}
},
{
$addFields: { 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.

Por ejemplo, cree una colección llamada vehicles con los siguientes documentos:

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( [
{ $addFields: { "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 $addFields, se reemplaza el campo original.

Una colección llamada animals contiene el siguiente documento:

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

La siguiente operación $addFields especifica el campo cats.

db.animals.aggregate( [
{
$addFields: { 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.

Una colección llamada fruit contiene los siguientes documentos:

db.fruit.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 $addFields para reemplazar el campo _id de cada documento con el valor del campo item y reemplaza el campo item con un valor estático.

db.fruit.aggregate( [
{
$addFields: {
_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 $addFields con una expresión $concatArrays para agregar un elemento a un campo de arreglo existente. Por ejemplo, la siguiente operación usa $addFields 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 } },
{ $addFields: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
] )

La operación devuelve lo siguiente:

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

Puedes usar $addFields con la variable $$REMOVE para remover campos del documento.

Por ejemplo, cree una colección labReadings:

db.labReadings.insertMany( [
{
date: ISODate("2024-10-09"),
temperature: 80
},
{
date: null,
temperature: 83
},
{
date: ISODate("2024-12-09"),
temperature: 85
}
] )

Para remover el campo date de los documentos labReadings, utiliza $addFields con la variable $$REMOVE:

db.labReadings.aggregate( [
{
$addFields: { date: "$$REMOVE" }
}
] )

Salida:

[
{ _id: ObjectId('671285306fd2c3b24f2e7eaa'), temperature: 80 },
{ _id: ObjectId('671285306fd2c3b24f2e7eab'), temperature: 83 },
{ _id: ObjectId('671285306fd2c3b24f2e7eac'), temperature: 85 }
]

También puede utilizar $$REMOVE para remover campos condicionalmente. Por ejemplo, la siguiente agregación remueve el campo date de los documentos donde date es null:

db.labReadings.aggregate( [
{
$addFields:
{
date: {
$ifNull: [ "$date", "$$REMOVE" ]
}
}
}
] )

Salida:

[
{
_id: ObjectId('671285306fd2c3b24f2e7eaa'),
date: ISODate('2024-10-09T00:00:00.000Z'),
temperature: 80
},
{ _id: ObjectId('671285306fd2c3b24f2e7eab'), temperature: 83 },
{
_id: ObjectId('671285306fd2c3b24f2e7eac'),
date: ISODate('2024-12-09T00:00:00.000Z'),
temperature: 85
}
]

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 $addFields a una canalización de agregación, utilice el Operador $addFields en un objeto de canalización.

El siguiente ejemplo crea una etapa de pipeline que agrega un campo totalReviews a cada documento de película, que contiene el número total de revisiones de la película. A continuación, el ejemplo ejecuta el pipeline de agregación:

const pipeline = [
{
$addFields: {
totalReviews: {
$add: ["$imdb.votes", "$tomatoes.viewer.numReviews"]
}
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

Tip

Comparación con $project

Puedes usar la plataforma $addFields o $project para remover campos de documentos. El mejor enfoque depende de su pipeline y de cuánto del documento original desea conservar.

Para un ejemplo usando $$REMOVE en una etapa de $project, vea Excluir campos condicionalmente.

Para obtener más información sobre las etapas relacionadas del pipeline, consulte las guías $project y $set.

Volver

Etapas de la pipeline de agregación

En esta página