Compartir a través de


$addFields (agregación)

La fase $addFields de la canalización de agregación se usa para agregar nuevos campos a los documentos. También se puede usar para restablecer los valores de los campos existentes. Esta fase resulta especialmente útil cuando sea necesario crear nuevos campos basados en datos existentes o modificar campos existentes dentro de los documentos.

Sintaxis

La sintaxis básica de la fase $addFields es la siguiente:

{
  $addFields: {
    <newField1>: <expression1>,
    <newField2>: <expression2>,
    ...
  }
}

Parámetros

Descripción
newField1 Nombre del nuevo campo que se agregará o del campo existente que se modificará.
expression1 Expresión para calcular el valor de newField1.

Ejemplos

Ejemplo 1: agregar un nuevo campo

Supongamos que tenemos una colección denominada tiendas con documentos similares a la estructura JSON proporcionada. Para agregar un nuevo campo totalDiscountEvents que cuente el número de eventos de promoción, usaremos la siguiente canalización de agregación:

db.stores.aggregate([
  {
    $addFields: {
      totalDiscountEvents: { $size: "$store.promotionEvents" }
    }
  }
])

Salida de ejemplo

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "promotionEvents": ["Summer Sale", "Black Friday", "Holiday Deals"]
    },
    "totalDiscountEvents": 3
  }
]

Ejemplo 2: modificar un campo existente

Si queremos agregar un campo totalStaffCount que sume el personal a tiempo completo y a tiempo parcial, usaremos:

db.stores.aggregate([
  {
    $addFields: {
      totalStaffCount: {
        $add: ["$store.staff.totalStaff.fullTime", "$store.staff.totalStaff.partTime"]
      }
    }
  }
])

Salida de ejemplo

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "staff": {
        "totalStaff": {
          "fullTime": 12,
          "partTime": 8
        }
      }
    },
    "totalStaffCount": 20
  }
]

Ejemplo 3: agregar campos anidados

Para agregar una ubicación de campo location.coordinates que combine latitud y longitud en una matriz, use:

db.stores.aggregate([
  {
    $addFields: {
      "store.location.coordinates": ["$store.location.lat", "$store.location.lon"]
    }
  }
])

Salida de ejemplo

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "location": {
        "lat": 47.6097,
        "lon": -122.3331,
        "coordinates": [47.6097, -122.3331]
      }
    }
  }
]