$zagęścić

Etap $densify w potoku agregacji służy do wypełniania brakujących punktów danych w ramach sekwencji wartości. Ułatwia utworzenie bardziej kompletnego zestawu danych przez wygenerowanie brakujących wartości na podstawie określonego pola, zakresu i kroku. Jest to przydatne w scenariuszach, takich jak analiza danych szeregów czasowych, w których należy wypełnić luki w punktach danych w celu zapewnienia dokładnej analizy.

Składnia

{
  $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 którym jest przeprowadzane zagęszczenie.
range.step Rozmiar kroku generowania brakujących wartości.
range.unit (Opcjonalnie) Jednostka rozmiaru kroku, taka jak jednostki czasu (np. "godzina", "dzień").
range.bounds (Opcjonalnie) Określa zakres (dolne i górne granice) dla zagęszczenia.
partitionByFields (Opcjonalnie) Pola używane do grupowania danych w celu zagęszczenia.

Przykłady

Rozważmy ten przykładowy dokument z kolekcji sklepów.

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

Przykład 1. Densify zestawu danych szeregów czasowych

To zapytanie wypełnia brakujące dni w polu daty.

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

To zapytanie zwraca następujące wyniki:

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

Przykład 2. Densify danych liczbowych

To zapytanie wypełnia brakujące wartości liczbowe w sales.fullSales polu:

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

To zapytanie zwraca następujące wyniki:

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

Ograniczenia

W poniższej tabeli przedstawiono podsumowanie kluczowych ograniczeń i zachowań skojarzonych z etapem $densify w potokach agregacji:

Kategoria Warunek/zachowanie
Ograniczenia pól — Błędy, jeśli jakikolwiek dokument ma wartość daty i unitnie jest określony.
— Błędy, jeśli jakikolwiek dokument ma wartość liczbową i unit jest określony.
— Nazwa pola zaczyna się od $. Użyj polecenia $project , aby zmienić jego nazwę.
partitionByFields — Każde pole daje w wyniku wartość inną niż ciąg .
— Nazwa pola zaczyna się od $.
range.bounds - Dolna granica definiuje wartość początkową, niezależnie od istniejących dokumentów.
- Dolna granica jest inkluzywna.
- Górna granica jest wyłączna.
- $densify nie filtruje dokumentów poza granicami.