Partager via


$locf

L’opérateur $locf propage la dernière valeur non null observée dans une partition dans une requête fenêtré. L’opérateur $locf est particulièrement utile pour remplir les points de données manquants dans les données de série chronologique ou d’autres jeux de données présentant des lacunes.

Syntaxe

{
  $locf: {
    input: <expression>,
    sortBy: <document>
  }
}

Paramètres

Paramètre Descriptif
input Expression qui se résout sur le champ dont vous souhaitez propager la valeur.
sortBy Document qui spécifie l’ordre de tri de la partition.

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 : Utilisation $locf pour remplir les données de série chronologique manquantes

Pour propager la valeur non null la plus récente pour le champ lastUpdated entre les magasins de la société « First Up Consultants », exécutez d’abord une requête pour partitionner les magasins au sein de l’entreprise. Ensuite, utilisez l’opérateur $lecf pour propager la dernière valeur non null pour le champ pour tous les magasins de la partition.

db.stores.aggregate([{
    "$match": {
        "company": {
            "$in": ["First Up Consultants"]
        }
    }
}, {
    "$setWindowFields": {
        "partitionBy": "$name",
        "sortBy": {
            "sales.revenue": 1
        },
        "output": {
            "lastUpdatedDate": {
                "$locf": {
                    "lastUpdated": 1
                }
            }
        }
    }
}, {
    "$project": {
        "company": 1,
        "name": 1,
        "lastObservedDiscount": 1
    }
}])

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",
        "company": "First Up Consultants"
    },
    {
        "_id": "c4883253-7ccd-4054-a7e0-8aeb202307b5",
        "name": "First Up Consultants | Appliance Bargains - New Kari",
        "company": "First Up Consultants"
    },
    {
        "_id": "a159ff5c-6ec5-4ca8-9672-e8903a54dd90",
        "name": "First Up Consultants | Appliance Bargains - Schadenstad",
        "company": "First Up Consultants"
    }
]