$merge

$merge Toplama işlem hattındaki aşama, toplama sorgusunun sonuçlarını belirtilen koleksiyona yazmak için kullanılır. Bu aşama, bir toplama işleminin çıktısına göre belgeleri güncelleştirme veya hedef koleksiyona ekleme gibi görevler için özellikle yararlıdır. Veri dönüştürme ve veri kalıcılığını tek bir işlemde birleştirerek iş akışlarını kolaylaştırmaya yardımcı olur.

Sözdizimi

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

Parametreler

Parametre Description
into Toplama sonuçlarının yazılacağı hedef koleksiyonu belirtir.
on Hedef koleksiyondaki eşleşen belgeleri tanımlamak için alanları belirtir.
whenMatched Eşleşen bir belge bulunduğunda gerçekleştirecek eylemi belirtir. Seçenekler arasında merge, replace, keepExisting, fail, veya özel bir işlem hattı bulunur.
whenNotMatched Eşleşen belge bulunamadığında gerçekleştirecek eylemi belirtir. insert veya discard seçenekler arasında bulunur.

Örnekler

Stores koleksiyonundaki bu örnek belgeyi göz önünde bulundurun.

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

Örnek 1: Verileri bir koleksiyonda birleştirme

Bu sorgu, belgeleri toplar ve sonuçları adlı salesSummarybir koleksiyona yazar; eşleşen mevcut belgeleri _id güncelleştirir ve aksi takdirde yeni belgeler ekler.

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

Örnek 2: Hedef koleksiyondaki belgeleri değiştirme

Bu örnek, promotionEventsSummary alanına göre _id koleksiyonundaki belgeleri değiştirir.

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