Partager via


$linearFill

L’opérateur $linearFill interpole les valeurs manquantes dans une séquence de documents. L’opérateur $linearFill effectue une interpolation linéaire pour les données manquantes, ce qui en fait utile pour les jeux de données présentant des lacunes dans les valeurs, telles que les données de série chronologique.

Syntaxe

{
    $linearFill: {
        input: < expression > ,
        sortBy: {
            < field >: < 1 or - 1 >
        }
    }
}

Paramètres

Paramètre Descriptif
input Champ ou expression pour lequel interpoler les valeurs manquantes.
sortBy Spécifie le champ par lequel les données sont triées pour l’interpolation, ainsi que l’ordre de tri (1 pour l’ordre croissant, -1 pour l’interpolation).

Examples

Considérez cet exemple de document de la collection des magasins.

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

Exemple 1 : Interpolation des données de ventes manquantes

Pour interpoler les données de ventes manquantes, exécutez une requête pour commencer par partitionner les magasins dans le jeu de données par nom. Ensuite, utilisez l’opérateur $linearFill pour interpoler les données de ventes manquantes dans les magasins de la partition.

db.stores.aggregate([{
        "$match": {
            "company": {
                "$in": ["First Up Consultants"]
            }
        }
    },
    {
        "$setWindowFields": {
            "partitionBy": "$name",
            "sortBy": {
                "storeOpeningDate": 1
            },
            "output": {
                "interpolatedSales": {
                    "$linearFill": "$sales.totalSales"
                }
            }
        }
    }
])

Les trois premiers résultats retournés par cette requête sont les suivants :

[
    {
        "_id": "0f4c48fe-c43b-4083-a856-afe6dd902077",
        "name": "First Up Consultants | Appliance Bargains - Feilmouth",
        "interpolatedSales": 26630
    },
    {
        "_id": "c4883253-7ccd-4054-a7e0-8aeb202307b5",
        "name": "First Up Consultants | Appliance Bargains - New Kari",
        "interpolatedSales": 31568
    },
    {
        "_id": "a159ff5c-6ec5-4ca8-9672-e8903a54dd90",
        "name": "First Up Consultants | Appliance Bargains - Schadenstad",
        "interpolatedSales": 59926
    }
]