$densify

Az $densify aggregációs folyamat szakasza a hiányzó adatpontok értéksorozaton belüli kitöltésére szolgál. Segít a teljesebb adathalmaz létrehozásában azáltal, hogy hiányzó értékeket hoz létre egy megadott mező, tartomány és lépés alapján. Ez olyan helyzetekben hasznos, mint az idősoros adatelemzés, ahol az adatpontok közötti réseket ki kell tölteni a pontos elemzés érdekében.

Szemantika

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

Paraméterek

Paraméter Description
field Az a mező, amelyen a densification végrehajtása történik.
range.step A hiányzó értékek generálásának lépésmérete.
range.unit (Nem kötelező) A lépésméret mértékegysége, például időegységek (pl. "óra", "nap").
range.bounds (Nem kötelező) Megadja a densification tartományát (alsó és felső határ).
partitionByFields (Nem kötelező) A denszifikáció adatainak csoportosításához használt mezők.

Példák

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

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

1. példa: Idősoros adatkészlet densifyálása

Ez a lekérdezés kitölti a hiányzó napokat a dátummezőben.

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

Ez a lekérdezés a következő eredményeket adja vissza:

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

2. példa: Numerikus adatok densifyálása

Ez a lekérdezés hiányzó numerikus értékeket tölt ki a sales.fullSales mezőben:

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

Ez a lekérdezés a következő eredményeket adja vissza:

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

Korlátozások

Az alábbi táblázat összefoglalja az összesítési folyamatok $densify szakaszához kapcsolódó fő korlátozásokat és viselkedéseket:

Kategória Feltétel / Viselkedés
Mezőkorlátozások – Hiba, ha egy dokumentum dátumértékekkel rendelkezik, és unitnincs megadva.
– Hibák, ha bármely dokumentum numerikus értékkel rendelkezik, és unitmeg van adva.
- A mező neve a következővel $kezdődik: . Átnevezheti $project .
partitionByFields – Bármely mező nem sztring értékű.
- A mező neve a következővel $kezdődik: .
range.bounds - Az alsó határ a kezdőértéket határozza meg, a meglévő dokumentumoktól függetlenül.
- Az alsó határ a befogadó.
- A felső határ kizárólagos.
- $densify nem szűri ki a határokon kívüli dokumentumokat.