Compartir a través de


$merge

La $merge etapa en una canalización de agregación se usa para escribir los resultados de la consulta de agregación en una colección especificada. Esta fase es especialmente útil para tareas como actualizar o insertar documentos en una colección de destino en función de la salida de una operación de agregación. Ayuda a simplificar los flujos de trabajo mediante la combinación de la transformación de datos y la persistencia de datos en una sola operación.

Sintaxis

{
  $merge: {
    into: <collection>,
    on: <field or fields>,
    whenMatched: <action>,
    whenNotMatched: <action>
  }
}

Parámetros

Parámetro Descripción
into Especifica la colección de destino donde se escribirán los resultados de agregación.
on Especifica los campos para identificar los documentos coincidentes en la colección de destino.
whenMatched Especifica la acción que se debe realizar cuando se encuentra un documento coincidente. Las opciones incluyen merge, replace, keepExisting, failo una canalización personalizada.
whenNotMatched Especifica la acción que se debe realizar cuando no se encuentra ningún documento coincidente. Las opciones incluyen insert o discard.

Ejemplos

Considere este documento de ejemplo de la colección de tiendas.

{
  "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
   "name": "Lakeshore Retail | DJ Equipment Stop - Port Cecile",
  "location": {
    "lat": 60.1441,
    "lon": -141.5012
  },
  "staff": {
    "totalStaff": {
      "fullTime": 2,
      "partTime": 0
    }
  },
  "sales": {
    "salesByCategory": [
      {
        "categoryName": "DJ Headphones",
        "totalSales": 35921
      }
    ],
    "fullSales": 3700
  },
  "promotionEvents": [
    {
      "eventName": "Bargain Blitz Days",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 3,
          "Day": 11
        },
        "endDate": {
          "Year": 2024,
          "Month": 2,
          "Day": 18
        }
      },
      "discounts": [
        {
          "categoryName": "DJ Turntables",
          "discountPercentage": 18
        },
        {
          "categoryName": "DJ Mixers",
          "discountPercentage": 15
        }
      ]
    }
  ],
  "tag": [
    "#ShopLocal",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}

Ejemplo 1: Combinar datos en una colección

Esta consulta agrega documentos y escribe los resultados en una colección denominada salesSummary, actualizando los documentos existentes donde coincide _id e inserta nuevos documentos de lo contrario.

db.sales.aggregate([
  {
    $group: {
      _id: "$sales.salesByCategory.categoryName",
      totalSales: { $sum: "$sales.salesByCategory.totalSales" }
    }
  },
  {
    $merge: {
      into: "salesSummary",
      on: "_id",
      whenMatched: "merge",
      whenNotMatched: "insert"
    }
  }
])

Ejemplo 2: Reemplazar documentos de la colección de destino

En este ejemplo, los documentos de la colección promotionEventsSummary se reemplazan basándose en el campo _id.

db.promotionEvents.aggregate([
  {
    $project: {
      _id: "$eventName",
      startDate: "$promotionalDates.startDate",
      endDate: "$promotionalDates.endDate",
      totalDiscounts: { $size: "$discounts" }
    }
  },
  {
    $merge: {
      into: "promotionEventsSummary",
      on: "_id",
      whenMatched: "replace",
      whenNotMatched: "insert"
    }
  }
])