Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$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 $addFields etapa es equivalente a una $project etapa que especifica explícitamente todos los campos existentes en los documentos de entrada y añade 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.

La etapa tiene la siguiente sintaxis:

{ $addFields: { <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), $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.

  • $addFields 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:

    {$addFields: { 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 $addFields, ú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 etapas para primero convertir el tiempo de ejecución en horas, luego calcular una tasa de licencia a $addFields $80000.50 por hora:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: {
runtimeHours: {
$floor: { $divide: [ "$runtime", 60 ] }
},
ratingOutOf100: { $multiply: [ "$imdb.rating", 10 ] }
}
},
{
$addFields: {
licenseFeeUSD: {
$multiply: [ "$runtimeHours", 0.50 ]
}
}
}
] )
[
{ _id: ..., title: 'Baseball', runtime: 1140, runtimeHours: 19, licenseFeeUSD: 9.5 },
{ _id: ..., title: 'Centennial', runtime: 1256, runtimeHours: 20, licenseFeeUSD: 10 }
]
...

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

La siguiente operación de agregación añade un campo certified al documento imdb incrustado en cada película:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{ $addFields: { "imdb.certified": true } }
] )
[
{ _id: ..., title: 'Baseball', imdb: { certified: true, '...': '...' } },
{ _id: ..., title: 'Centennial', imdb: { certified: true, '...': '...' } }
]
...

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

La siguiente operación $addFields sobrescribe el campo runtime para añadir 15 minutos:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: { runtime: { $add: [ "$runtime", 15 ] } }
}
] )
[
{ _id: ..., title: 'Baseball', runtime: 1155 },
{ _id: ..., title: 'Centennial', runtime: 1271 }
]
...

También puedes reemplazar un campo por otro. La siguiente operación asigna _id al título de la película y reemplaza el campo title por el género principal de la película:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: {
_id: "$title",
title: { $arrayElemAt: [ "$genres", 0 ] }
}
}
] )
[
{ _id: 'Baseball', title: 'Documentary' },
{ _id: 'Centennial', title: 'Action' }
]
...

Puedes usar $addFields con una expresión $concatArrays para añadir un elemento a un campo de arreglo ya existente. La siguiente operación añade Epic al arreglo genres de películas con el título Centennial:

db.movies.aggregate( [
{ $match: { title: "Centennial" } },
{ $addFields: {
genres: {
$concatArrays: [ "$genres", [ "Epic" ] ]
}
} }
] )
[
{ _id: ..., title: 'Centennial', genres: [ 'Action', 'Adventure', 'Drama', 'Epic' ] }
]
...

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

La siguiente operación usa $addFields para remover el campo plot con la variable $$REMOVE:

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: { plot: "$$REMOVE" }
}
] )
[
{ _id: ..., title: 'Baseball', runtime: 1140 },
{ _id: ..., title: 'Centennial', runtime: 1256 }
]
...

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

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields:
{
rated: {
$ifNull: [ "$rated", "$$REMOVE" ]
}
}
}
] )
[
{ _id: ..., title: 'Baseball', rated: 'TV-PG' },
{ _id: ..., title: 'Centennial' }
]
...

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 agregación

En esta página