$densify

Fáze $densify v kanálu agregace slouží k vyplnění chybějících datových bodů v posloupnosti hodnot. Pomáhá při vytváření ucelenější datové sady generováním chybějících hodnot na základě zadaného pole, rozsahu a kroku. To je užitečné ve scénářích, jako je analýza dat časových řad, kdy je potřeba vyplnit mezery v datových bodech, aby se zajistila přesná analýza.

Syntaxe

{
  $densify: {
    field: <field>,
    range: {
      step: <number>,
      unit: <string>, // Optional, e.g., "hour", "day", "month", etc.
      bounds: [<lowerBound>, <upperBound>] // Optional
    },
    partitionByFields: [<field1>, <field2>, ...] // Optional
  }
}

Parametry

Parameter Description
field Pole, na kterém se provádí denifikace.
range.step Velikost kroku pro generování chybějících hodnot.
range.unit (Volitelné) Jednotka velikosti kroku, například časové jednotky (např. "hodina", "den").
range.bounds (Volitelné) Určuje rozsah (dolní a horní mez) pro densifikace.
partitionByFields (Volitelné) Pole použitá k seskupení dat pro densifikace.

Examples

Podívejte se na tento ukázkový dokument z kolekce stores.

{
    "_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
    "name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
    "location": {
        "lat": -89.2384,
        "lon": -46.4012
    },
    "staff": {
        "totalStaff": {
            "fullTime": 8,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 75670,
        "salesByCategory": [
            {
                "categoryName": "Wine Accessories",
                "totalSales": 34440
            },
            {
                "categoryName": "Bitters",
                "totalSales": 39496
            },
            {
                "categoryName": "Rum",
                "totalSales": 1734
            }
        ]
    },
    "promotionEvents": [
        {
            "eventName": "Unbeatable Bargain Bash",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 6,
                    "Day": 23
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 7,
                    "Day": 2
                }
            },
            "discounts": [
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 7
                },
                {
                    "categoryName": "Bitters",
                    "discountPercentage": 15
                },
                {
                    "categoryName": "Brandy",
                    "discountPercentage": 8
                },
                {
                    "categoryName": "Sports Drinks",
                    "discountPercentage": 22
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 19
                }
            ]
        },
        {
            "eventName": "Steal of a Deal Days",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 21
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 29
                }
            },
            "discounts": [
                {
                    "categoryName": "Organic Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "White Wine",
                    "discountPercentage": 20
                },
                {
                    "categoryName": "Sparkling Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 17
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 23
                }
            ]
        }
    ]
}

Příklad 1: Densify a time-series dataset

Tento dotaz vyplní chybějící dny v poli kalendářního data.

db.aggregate([
    {
      $documents: [
        { date: new ISODate("2024-01-01"), value: 10 },
        { date: new ISODate("2024-01-03"), value: 15 }
      ]
    },
    {
      $densify: {
        field: "date",
        range: {
          step: 1,
          unit: "day",
          bounds: "full"
        }
      }
    }
  ]);

Tento dotaz vrátí následující výsledky:

[
    {
        "date": "ISODate('2024-01-01T00:00:00.000Z')",
        "value": 10
    },
    {
        "date": "ISODate('2024-01-02T00:00:00.000Z')"
    },
    {
        "date": "ISODate('2024-01-03T00:00:00.000Z')",
        "value": 15
    }
]

Příklad 2: Densify numerická data

Tento dotaz vyplní chybějící číselné hodnoty v sales.fullSales poli:

db.aggregate([
    {
      $documents: [
        { level: 1, score: 10 },
        { level: 3, score: 30 }
      ]
    },
    {
      $densify: {
        field: "level",
        range: {
          step: 1,
          bounds: [1, 5] 
        }
      }
    }
  ]);

Tento dotaz vrátí následující výsledky:

[
    {
        "level": 1,
        "score": 10
    },
    {
        "level": 2
    },
    {
        "level": 3,
        "score": 30
    },
    {
        "level": 4
    }
]

Omezení

Následující tabulka shrnuje klíčová omezení a chování související s fází $densify v kanálech agregace:

Kategorie Podmínka / chování
Omezení polí – Chyby, pokud některý dokument obsahuje hodnotu data a unitnení zadán.
– Chyby, pokud některý dokument obsahuje číselnou hodnotu a unit je zadán.
- Název pole začíná na $. Slouží $project k přejmenování.
partitionByFields – Jakékoli pole se vyhodnotí jako neřetězcová hodnota.
- Název pole začíná na $.
range.bounds - Dolní mez definuje počáteční hodnotu bez ohledu na existující dokumenty.
- Dolní mez je inkluzivní.
- Horní mez je výhradní.
- $densify nefiltruje dokumenty mimo hranice.