$fill

Tahap $fill ini digunakan untuk mengisi nilai yang hilang atau null dalam dokumen dalam alur agregasi. Ini menyediakan berbagai metode untuk mengisi data yang hilang, termasuk menggunakan nilai statis, interpolasi linier, atau nilai dari dokumen sebelumnya/berikutnya.

Syntax

{
  $fill: {
    sortBy: <sort specification>,
    partitionBy: <partition fields>,
    partitionByFields: <array of partition field names>,
    output: {
      <field1>: { value: <expression> },
      <field2>: { method: <string> }
    }
  }
}

Parameter-parameternya

Pengaturan Description
sortBy Menentukan urutan pengurutan untuk dokumen saat menerapkan metode isian yang bergantung pada urutan dokumen.
partitionBy Optional. Mengelompokkan dokumen ke dalam partisi. Operasi pengisian diterapkan dalam setiap partisi secara terpisah.
partitionByFields Optional. Sintaksis alternatif untuk partitionBy menggunakan array nama bidang.
output Menentukan bidang yang akan diisi dan metode atau nilai yang akan digunakan untuk mengisi data yang hilang.

Metode Isian

Metode Description
value Isi dengan hasil nilai atau ekspresi statis tertentu.
linear Isi menggunakan interpolasi linier antara nilai yang diketahui (bidang numerik saja).
locf Pengamatan Terakhir Dibawa Maju - gunakan nilai terakhir yang diketahui.
linear Interpolasi linier antara nilai di sekitarnya.

Examples

Pertimbangkan dokumen sampel ini dari koleksi toko.

{
  "_id": "2cf3f885-9962-4b67-a172-aa9039e9ae2f",
  "name": "First Up Consultants | Bed and Bath Center - South Amir",
  "location": {
    "lat": 60.7954,
    "lon": -142.0012
  },
  "staff": {
    "totalStaff": {
      "fullTime": 18,
      "partTime": 17
    }
  },
  "sales": {
    "totalSales": 37701,
    "salesByCategory": [
      {
        "categoryName": "Mattress Toppers",
        "totalSales": 37701
      }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Price Drop Palooza",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 9,
          "Day": 21
        },
        "endDate": {
          "Year": 2024,
          "Month": 9,
          "Day": 30
        }
      },
      "discounts": [
        {
          "categoryName": "Bath Accessories",
          "discountPercentage": 18
        },
        {
          "categoryName": "Pillow Top Mattresses",
          "discountPercentage": 17
        }
      ]
    }
  ]
}

Contoh 1: Isi nilai yang hilang dengan nilai statis

Kueri ini mengisi nilai yang totalSales hilang salesByCategory dalam array dengan nilai default 0.

db.stores.aggregate([{
    $match: {
        company: {
            $in: ["First Up Consultants"]
        }
    }
}, {
    $unwind: "$sales.salesByCategory"
}, {
    $fill: {
        output: {
            "sales.salesByCategory.totalSales": {
                value: 0
            }
        }
    }
}, {
    $group: {
        _id: "$_id",
        name: {
            $first: "$name"
        },
        salesByCategory: {
            $push: "$sales.salesByCategory"
        }
    }
}])

Dua hasil pertama yang dikembalikan oleh kueri ini adalah:

[
    {
        "_id": "affdc09c-7356-4fff-a857-e8301f57159c",
        "name": "First Up Consultants | Sports Gear Pantry - Wildermanhaven",
        "salesByCategory": [
            {
                "categoryName": "Baseball Gear",
                "totalSales": 33878
            },
            {
                "categoryName": "Volleyball Gear",
                "totalSales": 34031
            }
        ]
    },
    {
        "_id": "1cf667b4-d8ce-4f1a-bad1-a1f0bbce26c2",
        "name": "First Up Consultants | Picture Frame Variety - New Abrahamborough",
        "salesByCategory": [
            {
                "categoryName": "Picture Hanging Supplies",
                "totalSales": 7229
            },
            {
                "categoryName": "Collage Frames",
                "totalSales": 40014
            }
        ]
    }
]

Contoh 2: Isi data staf yang hilang menggunakan pengamatan terakhir yang dibawa ke depan

Kueri ini mengisi data staf paruh waktu yang hilang menggunakan nilai terakhir yang diketahui dalam setiap grup penyimpanan.

db.stores.aggregate([{
    $fill: {
        sortBy: {
            "_id": 1
        },
        output: {
            "staff.totalStaff.partTime": {
                method: "locf"
            }
        }
    }
}, {
    $project: {
        name: 1,
        "staff.totalStaff": 1
    }
}])

Dua hasil pertama yang dikembalikan oleh kueri ini adalah:

[
    {
        "_id": "00003278-4226-4ca7-871d-e80d8f414431",
        "name": "Wide World Importers | Camera Depot - Lake Luramouth",
        "staff": {
            "totalStaff": {
                "fullTime": 20,
                "partTime": 6
            }
        }
    },
    {
        "_id": "00009bd0-c44e-4cc8-ab03-347076d74a1a",
        "name": "Wide World Importers | Music Stop - Rebeccaside",
        "staff": {
            "totalStaff": {
                "fullTime": 9,
                "partTime": 0
            }
        }
    }
]

Contoh 3: Isi persentase diskon yang hilang dengan nilai rata-rata

Kueri ini mengisi persentase diskon yang hilang dengan persentase diskon rata-rata di semua toko.

db.stores.aggregate([
  { $unwind: "$promotionEvents" },
  { $unwind: "$promotionEvents.discounts" },
  {
    $fill: {
      partitionBy: "$promotionEvents.eventName",
      sortBy: { "promotionEvents.discounts.categoryName": 1 },
      output: {
        "promotionEvents.discounts.discountPercentage": { 
          value: { $avg: "$promotionEvents.discounts.discountPercentage" } 
        }
      }
    }
  },
  {
    $group: {
      _id: { storeId: "$_id", eventName: "$promotionEvents.eventName" },
      storeName: { $first: "$name" },
      eventName: { $first: "$promotionEvents.eventName" },
      discounts: { $push: "$promotionEvents.discounts" }
    }
  }
])

Dua hasil pertama yang dikembalikan oleh kueri ini adalah:

[
    {
        "_id": {
            "storeId": "70d4cc90-23b1-46e3-8f59-630648e311a4",
            "eventName": "Price Slash Spectacular"
        },
        "storeName": "Wide World Importers | Music Bazaar - West Johnpaulhaven",
        "eventName": "Price Slash Spectacular",
        "discounts": [
            {
                "categoryName": "CDs",
                "discountPercentage": 22
            },
            {
                "categoryName": "Vinyl Records",
                "discountPercentage": 21
            }
        ]
    },
    {
        "_id": {
            "storeId": "24873ac4-b2d1-4216-a425-3375a384b23d",
            "eventName": "Massive Deal Mania"
        },
        "storeName": "Northwind Traders | Furniture Pantry - Farrellchester",
        "eventName": "Massive Deal Mania",
        "discounts": [
            {
                "categoryName": "Bookcases",
                "discountPercentage": 22
            },
            {
                "categoryName": "Cabinets",
                "discountPercentage": 8
            }
        ]
    }
]

Kasus Penggunaan

  • Pembersihan Data: Mengisi nilai yang hilang dalam himpunan data yang diimpor
  • Data Rangkaian Waktu: Menangani kesenjangan dalam data berurutan menggunakan interpolasi
  • Nilai Default: Menetapkan nilai default ke bidang opsional
  • Normalisasi Data: Memastikan struktur data yang konsisten di seluruh dokumen