$fill

Aşama $fill , toplama işlem hattı içindeki belgelerde eksik veya null değerleri doldurmak için kullanılır. Statik değerleri, doğrusal ilişkilendirmeyi veya önceki/sonraki belgelerdeki değerleri kullanma dahil olmak üzere eksik verileri doldurmak için çeşitli yöntemler sağlar.

Sözdizimi

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

Parametreler

Parametre Description
sortBy Belge düzenine bağlı doldurma yöntemleri uygulanırken belgelerin sıralama düzenini belirtir.
partitionBy Optional. Belgeleri bölümler halinde gruplandırma. Doldurma işlemleri her bölüme ayrı olarak uygulanır.
partitionByFields Optional. Alan adları dizisi kullanan partitionBy için alternatif söz dizimi.
output Doldurulacak alanları ve eksik verileri doldurmak için kullanılacak yöntemi veya değeri belirtir.

Dolgu Yöntemleri

Yöntem Description
value Belirtilen statik değer veya ifade sonucuyla doldurun.
linear Bilinen değerler arasında doğrusal ilişkilendirme kullanarak doldurun (yalnızca sayısal alanlar).
locf son gözlem ileri taşındı - bilinen son değeri kullanın.
linear Çevreleyen değerler arasında doğrusal ilişkilendirme.

Örnekler

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

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

Örnek 1: Eksik değerleri statik değerle doldurma

Bu sorgu, dizideki totalSales eksik salesByCategory değerleri varsayılan 0 değeriyle doldurur.

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"
        }
    }
}])

Bu sorgu tarafından döndürülen ilk iki sonuç şunlardır:

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

Örnek 2: Devam eden son gözlemi kullanarak eksik personel verilerini doldurma

Bu sorgu, her depo grubundaki bilinen son değeri kullanarak eksik yarı zamanlı personel verilerini doldurur.

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

Bu sorgu tarafından döndürülen ilk iki sonuç şunlardır:

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

Örnek 3: Eksik indirim yüzdelerini ortalama değerle doldurma

Bu sorgu, eksik indirim yüzdelerini tüm mağazalardaki ortalama indirim yüzdesiyle doldurur.

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" }
    }
  }
])

Bu sorgu tarafından döndürülen ilk iki sonuç şunlardır:

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

Kullanım Örnekleri

  • Veri Temizleme: İçeri aktarılan veri kümelerindeki eksik değerleri doldurma
  • Zaman Serisi Verileri: İlişkilendirme kullanarak sıralı verilerdeki boşlukları işleme
  • Varsayılan Değerler: İsteğe bağlı alanlara varsayılan değerler atama
  • Veri Normalleştirme: Belgeler arasında tutarlı veri yapısı sağlayın