$fill

A $fill szakasz a hiányzó vagy null értékek kitöltésére szolgál az összesítési folyamat dokumentumaiban. Különböző módszereket kínál a hiányzó adatok feltöltésére, beleértve a statikus értékeket, a lineáris interpolációt vagy az előző/következő dokumentumok értékeit.

Szemantika

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

Paraméterek

Paraméter Description
sortBy A dokumentumok rendezési sorrendjét adja meg a dokumentumrendtől függő kitöltési módszerek alkalmazásakor.
partitionBy Opcionális. Dokumentumok csoportosítása partíciókba. A kitöltőműveleteket a rendszer külön alkalmazza az egyes partíciókon.
partitionByFields Opcionális. A partitionBy alternatív szintaxisa mezőnevek tömbjének használatával.
output Megadja a kitöltendő mezőket, valamint a hiányzó adatok kitöltéséhez használandó metódust vagy értéket.

Kitöltési módszerek

Metódus Description
value Adjon meg egy megadott statikus értéket vagy kifejezési eredményt.
linear Kitöltés ismert értékek közötti lineáris interpolációval (csak numerikus mezők esetén).
locf Utolsó továbbvitt megfigyelés – használja az utolsó ismert értéket.
linear Lineáris interpoláció a környező értékek között.

Példák

Tekintse át ezt a mintadokumentumot az áruházak gyűjteményéből.

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

1. példa: Hiányzó értékek kitöltése statikus értékkel

Ez a lekérdezés a totalSales tömb hiányzó salesByCategory értékeit tölti ki 0 alapértelmezett értékkel.

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

A lekérdezés által visszaadott első két eredmény a következő:

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

2. példa: Hiányzó alkalmazottak adatainak kitöltése az utolsó elvégzett megfigyeléssel

Ez a lekérdezés kitölti a hiányzó részmunkaidős alkalmazottak adatait az egyes áruházcsoportok utolsó ismert értékével.

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

A lekérdezés által visszaadott első két eredmény a következő:

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

3. példa: Hiányzó kedvezmény százalékos értékének kitöltése átlagértékkel

Ez a lekérdezés kitölti a hiányzó kedvezmény százalékos értékét az összes üzlet átlagos kedvezményszázalékával.

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

A lekérdezés által visszaadott első két eredmény a következő:

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

Használati esetek

  • Adattisztítás: Hiányzó értékek kitöltése importált adathalmazokban
  • Idősoradatok: A szekvenciális adatok hézagainak kezelése interpolációval
  • Alapértelmezett értékek: Alapértelmezett értékek hozzárendelése választható mezőkhöz
  • Adat normalizálása: Egységes adatstruktúra biztosítása a dokumentumok között