Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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. |