$fill

De $fill fase wordt gebruikt om ontbrekende of null-waarden in documenten in de aggregatiepijplijn in te vullen. Het biedt verschillende methoden voor het vullen van ontbrekende gegevens, waaronder het gebruik van statische waarden, lineaire interpolatie of waarden uit vorige/volgende documenten.

Syntaxis

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

Parameterwaarden

Kenmerk Description
sortBy Hiermee geeft u de sorteervolgorde voor documenten op bij het toepassen van opvulmethoden die afhankelijk zijn van de documentvolgorde.
partitionBy Optional. Groepeert documenten in partities. Vulbewerkingen worden afzonderlijk binnen elke partitie toegepast.
partitionByFields Optional. Alternatieve syntaxis voor partitionBy met behulp van een matrix met veldnamen.
output Hiermee geeft u de velden op die moeten worden ingevuld en de methode of waarde die moet worden gebruikt voor het invullen van ontbrekende gegevens.

Opvulmethoden

Methode Description
value Vul een opgegeven statische waarde of expressieresultaat in.
linear Vul lineaire interpolatie in tussen bekende waarden (alleen numerieke velden).
locf Last Observation Carried Forward - gebruik de laatst bekende waarde.
linear Lineaire interpolatie tussen omringende waarden.

Voorbeelden

Bekijk dit voorbeelddocument uit de winkelverzameling.

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

Voorbeeld 1: Ontbrekende waarden vullen met statische waarde

Met deze query worden ontbrekende totalSales waarden in de salesByCategory matrix ingevuld met een standaardwaarde van 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"
        }
    }
}])

De eerste twee resultaten die door deze query worden geretourneerd, zijn:

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

Voorbeeld 2: Ontbrekende personeelsgegevens invullen met behulp van laatste waarneming die is uitgevoerd

Met deze query worden ontbrekende parttime personeelsgegevens ingevuld met behulp van de laatst bekende waarde binnen elke winkelgroep.

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

De eerste twee resultaten die door deze query worden geretourneerd, zijn:

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

Voorbeeld 3: Ontbrekende kortingspercentages vullen met gemiddelde waarde

Met deze query worden ontbrekende kortingspercentages ingevuld met het gemiddelde kortingspercentage in alle winkels.

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

De eerste twee resultaten die door deze query worden geretourneerd, zijn:

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

Gebruiksvoorbeelden

  • Gegevens opschonen: ontbrekende waarden in geïmporteerde gegevenssets doorvoeren
  • Time Series-gegevens: hiaten in sequentiële gegevens verwerken met behulp van interpolatie
  • Standaardwaarden: standaardwaarden toewijzen aan optionele velden
  • Gegevensnormalisatie: zorgen voor consistente gegevensstructuur in documenten