Partager via


$merge

L’étape $merge d’un pipeline d’agrégation est utilisée pour écrire les résultats de la requête d’agrégation dans une collection spécifiée. Cette étape est particulièrement utile pour les tâches telles que la mise à jour ou l’insertion de documents dans une collection cible en fonction de la sortie d’une opération d’agrégation. Il permet de simplifier les flux de travail en combinant la transformation des données et la persistance des données dans une seule opération.

Syntaxe

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

Paramètres

Paramètre Descriptif
into Spécifie la collection cible dans laquelle les résultats d’agrégation seront écrits.
on Spécifie le ou les champs pour identifier les documents correspondants dans la collection cible.
whenMatched Spécifie l’action à entreprendre lorsqu’un document correspondant est trouvé. Les options incluent merge, , replacekeepExisting, failou un pipeline personnalisé.
whenNotMatched Spécifie l’action à entreprendre lorsqu’aucun document correspondant n’est trouvé. Les options incluent insert ou discard.

Examples

Considérez cet exemple de document de la collection des magasins.

{
  "_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"
  ]
}

Exemple 1 : Fusionner des données dans une collection

Cette requête agrège les documents et écrit les résultats dans une collection nommée salesSummary, mettant à jour les documents existants où les _id correspondances et l’insertion de nouveaux documents dans le cas contraire.

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

Exemple 2 : Remplacer des documents dans la collection cible

Cet exemple remplace les documents de la promotionEventsSummary collection en fonction du _id champ.

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