Bagikan melalui


$unwind (agregasi)

Tahap $unwind dalam kerangka kerja agregasi digunakan untuk mendekonstruksi bidang array dari dokumen input untuk menghasilkan dokumen untuk setiap elemen. Setiap dokumen output adalah salinan asli tetapi dengan nilai bidang array digantikan oleh satu elemen. Ini sangat berguna untuk menormalkan data yang disimpan dalam array dan untuk melakukan operasi pada setiap elemen array secara terpisah.

Sintaksis

{
  $unwind: {
    path: <field path>,
    includeArrayIndex: <string>, // Optional
    preserveNullAndEmptyArrays: <boolean> // Optional
  }
}

Parameter-parameternya

Deskripsi
path Jalur bidang ke bidang array. Ini adalah parameter yang diperlukan.
includeArrayIndex Fakultatif. Nama bidang baru untuk menyimpan indeks array dari elemen unwound.
preserveNullAndEmptyArrays Fakultatif. Jika true, jika jalur null, hilang, atau array kosong, $unwind menghasilkan dokumen tidak berubah.

Contoh

Contoh 1: Lepaskan Penjualan menurut Kategori

Untuk mendekonstruksi array salesByCategory di dokumen penyimpanan:

db.stores.aggregate([
  {
    $unwind: "$store.sales.salesByCategory"
  }
])

Contoh keluaran

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "sales": {
        "totalSales": 15000,
        "salesByCategory": {
          "category": "Electronics",
          "totalSales": 5000
        }
      }
    }
  },
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "sales": {
        "totalSales": 15000,
        "salesByCategory": {
          "category": "Clothing",
          "totalSales": 10000
        }
      }
    }
  }
]

Ini akan menghasilkan dokumen di mana setiap dokumen mewakili informasi penjualan satu kategori.

Contoh 2: Lepaskan Peristiwa Promosi dengan Indeks Array

Untuk mendekonstruksi array promotionEvents dan menyertakan indeks array dalam output:

db.stores.aggregate([
  {
    $unwind: {
      path: "$store.promotionEvents",
      includeArrayIndex: "eventIndex"
    }
  }
])

Contoh keluaran

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "promotionEvents": {
        "eventName": "Summer Sale",
        "eventDate": ISODate("2024-08-01T00:00:00Z")
      },
      "eventIndex": 0
    }
  },
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "promotionEvents": {
        "eventName": "Black Friday",
        "eventDate": ISODate("2024-11-25T00:00:00Z")
      },
      "eventIndex": 1
    }
  }
]

Ini akan menghasilkan dokumen di mana setiap dokumen mewakili satu peristiwa promosi, dan bidang eventIndex akan berisi indeks asli peristiwa dalam array.

Contoh 3: Melepas Diskon dalam Acara Promosi

Untuk mendekonstruksi array diskon dalam setiap acara promosi dan mempertahankan dokumen tanpa diskon:

db.stores.aggregate([
  {
    $unwind: {
      path: "$store.promotionEvents.discounts",
      preserveNullAndEmptyArrays: true
    }
  }
])

Contoh keluaran

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "promotionEvents": {
        "eventName": "Summer Sale",
        "discounts": {
          "discountType": "Percentage",
          "discountAmount": 20
        }
      }
    }
  },
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "promotionEvents": {
        "eventName": "Black Friday"
      }
    }
  }
]

Ini akan menghasilkan dokumen di mana setiap dokumen mewakili satu diskon dalam acara promosi, dan dokumen tanpa diskon akan dipertahankan.