Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La phase $fill permet de remplir des valeurs manquantes ou null dans des documents au sein du pipeline d’agrégation. Elle fournit différentes méthodes pour remplir les données manquantes, notamment à l’aide de valeurs statiques, d’interpolation linéaire ou de valeurs provenant de documents précédents/suivants.
Syntaxe
{
$fill: {
sortBy: <sort specification>,
partitionBy: <partition fields>,
partitionByFields: <array of partition field names>,
output: {
<field1>: { value: <expression> },
<field2>: { method: <string> }
}
}
}
Paramètres
| Paramètre | Descriptif |
|---|---|
sortBy |
Spécifie l’ordre de tri des documents lors de l’application de méthodes de remplissage qui dépendent de l’ordre des documents. |
partitionBy |
Optional. Regroupe les documents en partitions. Les opérations de remplissage sont appliquées dans chaque partition séparément. |
partitionByFields |
Optional. Syntaxe alternative pour partitionBy à l’aide d’un tableau de noms de champs. |
output |
Spécifie les champs à remplir et la méthode ou la valeur à utiliser pour remplir les données manquantes. |
Méthodes de remplissage
| Méthode | Descriptif |
|---|---|
value |
Remplir avec une valeur statique ou un résultat d’expression spécifié. |
linear |
Remplir à l’aide d’une interpolation linéaire entre des valeurs connues (champs numériques uniquement). |
locf |
Dernière observation reportée : utiliser la dernière valeur connue. |
linear |
Interpolation linéaire entre les valeurs environnantes. |
Examples
Considérez cet exemple de document de la collection des magasins.
{
"_id": "2cf3f885-9962-4b67-a172-aa9039e9ae2f",
"name": "First Up Consultants | Bed and Bath Center - South Amir",
"location": {
"lat": 60.7954,
"lon": -142.0012
},
"staff": {
"totalStaff": {
"fullTime": 18,
"partTime": 17
}
},
"sales": {
"totalSales": 37701,
"salesByCategory": [
{
"categoryName": "Mattress Toppers",
"totalSales": 37701
}
]
},
"promotionEvents": [
{
"eventName": "Price Drop Palooza",
"promotionalDates": {
"startDate": {
"Year": 2024,
"Month": 9,
"Day": 21
},
"endDate": {
"Year": 2024,
"Month": 9,
"Day": 30
}
},
"discounts": [
{
"categoryName": "Bath Accessories",
"discountPercentage": 18
},
{
"categoryName": "Pillow Top Mattresses",
"discountPercentage": 17
}
]
}
]
}
Exemple 1 : Remplir les valeurs manquantes avec une valeur statique
Cette requête remplit les valeurs manquantes totalSales dans le salesByCategory tableau avec une valeur par défaut de 0.
db.stores.aggregate([{
$match: {
company: {
$in: ["First Up Consultants"]
}
}
}, {
$unwind: "$sales.salesByCategory"
}, {
$fill: {
output: {
"sales.salesByCategory.totalSales": {
value: 0
}
}
}
}, {
$group: {
_id: "$_id",
name: {
$first: "$name"
},
salesByCategory: {
$push: "$sales.salesByCategory"
}
}
}])
Les deux premiers résultats retournés par cette requête sont les suivants :
[
{
"_id": "affdc09c-7356-4fff-a857-e8301f57159c",
"name": "First Up Consultants | Sports Gear Pantry - Wildermanhaven",
"salesByCategory": [
{
"categoryName": "Baseball Gear",
"totalSales": 33878
},
{
"categoryName": "Volleyball Gear",
"totalSales": 34031
}
]
},
{
"_id": "1cf667b4-d8ce-4f1a-bad1-a1f0bbce26c2",
"name": "First Up Consultants | Picture Frame Variety - New Abrahamborough",
"salesByCategory": [
{
"categoryName": "Picture Hanging Supplies",
"totalSales": 7229
},
{
"categoryName": "Collage Frames",
"totalSales": 40014
}
]
}
]
Exemple 2 : Remplir les données du personnel manquantes à l’aide de la dernière observation reportée
Cette requête remplit les données du personnel à temps partiel manquantes à l’aide de la dernière valeur connue au sein de chaque groupe de magasins.
db.stores.aggregate([{
$fill: {
sortBy: {
"_id": 1
},
output: {
"staff.totalStaff.partTime": {
method: "locf"
}
}
}
}, {
$project: {
name: 1,
"staff.totalStaff": 1
}
}])
Les deux premiers résultats retournés par cette requête sont les suivants :
[
{
"_id": "00003278-4226-4ca7-871d-e80d8f414431",
"name": "Wide World Importers | Camera Depot - Lake Luramouth",
"staff": {
"totalStaff": {
"fullTime": 20,
"partTime": 6
}
}
},
{
"_id": "00009bd0-c44e-4cc8-ab03-347076d74a1a",
"name": "Wide World Importers | Music Stop - Rebeccaside",
"staff": {
"totalStaff": {
"fullTime": 9,
"partTime": 0
}
}
}
]
Exemple 3 : Remplir les pourcentages de remise manquants avec une valeur moyenne
Cette requête remplit les pourcentages de remise manquants avec le pourcentage moyen de remise sur tous les magasins.
db.stores.aggregate([
{ $unwind: "$promotionEvents" },
{ $unwind: "$promotionEvents.discounts" },
{
$fill: {
partitionBy: "$promotionEvents.eventName",
sortBy: { "promotionEvents.discounts.categoryName": 1 },
output: {
"promotionEvents.discounts.discountPercentage": {
value: { $avg: "$promotionEvents.discounts.discountPercentage" }
}
}
}
},
{
$group: {
_id: { storeId: "$_id", eventName: "$promotionEvents.eventName" },
storeName: { $first: "$name" },
eventName: { $first: "$promotionEvents.eventName" },
discounts: { $push: "$promotionEvents.discounts" }
}
}
])
Les deux premiers résultats retournés par cette requête sont les suivants :
[
{
"_id": {
"storeId": "70d4cc90-23b1-46e3-8f59-630648e311a4",
"eventName": "Price Slash Spectacular"
},
"storeName": "Wide World Importers | Music Bazaar - West Johnpaulhaven",
"eventName": "Price Slash Spectacular",
"discounts": [
{
"categoryName": "CDs",
"discountPercentage": 22
},
{
"categoryName": "Vinyl Records",
"discountPercentage": 21
}
]
},
{
"_id": {
"storeId": "24873ac4-b2d1-4216-a425-3375a384b23d",
"eventName": "Massive Deal Mania"
},
"storeName": "Northwind Traders | Furniture Pantry - Farrellchester",
"eventName": "Massive Deal Mania",
"discounts": [
{
"categoryName": "Bookcases",
"discountPercentage": 22
},
{
"categoryName": "Cabinets",
"discountPercentage": 8
}
]
}
]
Cas d’usage
- Nettoyage des données : remplir les valeurs manquantes dans des jeux de données importés
- Données de série chronologique : gérer les lacunes dans les données séquentielles à l’aide de l’interpolation
- Valeurs par défaut : attribuer des valeurs par défaut à des champs facultatifs
- Normalisation des données : garantir une structure de données cohérente entre les documents