Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Fáze $fill slouží k vyplnění chybějících nebo nulových hodnot v dokumentech v rámci kanálu agregace. Poskytuje různé metody pro naplnění chybějících dat, včetně použití statických hodnot, lineární interpolace nebo hodnot z předchozích/dalších dokumentů.
Syntaxe
{
$fill: {
sortBy: <sort specification>,
partitionBy: <partition fields>,
partitionByFields: <array of partition field names>,
output: {
<field1>: { value: <expression> },
<field2>: { method: <string> }
}
}
}
Parametry
| Parameter | Description |
|---|---|
sortBy |
Určuje pořadí řazení dokumentů při použití metod výplně, které závisí na pořadí dokumentů. |
partitionBy |
Optional. Seskupí dokumenty do oddílů. Operace vyplnění se použijí v rámci každého oddílu zvlášť. |
partitionByFields |
Optional. Alternativní syntaxe pro partitionBy pomocí pole názvů polí |
output |
Určuje pole, která se mají vyplnit, a metodu nebo hodnotu, která se mají použít k vyplnění chybějících dat. |
Fill – metody
| Metoda | Description |
|---|---|
value |
Vyplňte zadanou statickou hodnotu nebo výsledek výrazu. |
linear |
Vyplňování pomocí lineární interpolace mezi známými hodnotami (pouze číselná pole). |
locf |
Poslední pozorování předávané dál – použijte poslední známou hodnotu. |
linear |
Lineární interpolace mezi okolními hodnotami. |
Examples
Podívejte se na tento ukázkový dokument z kolekce stores.
{
"_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
}
]
}
]
}
Příklad 1: Vyplnění chybějících hodnot statickou hodnotou
Tento dotaz vyplní chybějící totalSales hodnoty v salesByCategory poli výchozí hodnotou 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"
}
}
}])
První dva výsledky vrácené tímto dotazem jsou:
[
{
"_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
}
]
}
]
Příklad 2: Vyplnění chybějících dat o zaměstnancích s využitím posledního provedeného pozorování
Tento dotaz vyplní chybějící data zaměstnanců na částečný úvazek s použitím poslední známé hodnoty v rámci každé skupiny obchodů.
db.stores.aggregate([{
$fill: {
sortBy: {
"_id": 1
},
output: {
"staff.totalStaff.partTime": {
method: "locf"
}
}
}
}, {
$project: {
name: 1,
"staff.totalStaff": 1
}
}])
První dva výsledky vrácené tímto dotazem jsou:
[
{
"_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
}
}
}
]
Příklad 3: Vyplnění chybějících procent slevy průměrnou hodnotou
Tento dotaz vyplní chybějící procento slevy průměrnou procentuální slevou ve všech obchodech.
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" }
}
}
])
První dva výsledky vrácené tímto dotazem jsou:
[
{
"_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
}
]
}
]
Případy použití
- Čištění dat: Vyplnění chybějících hodnot v importovaných datových sadách
- Data časové řady: Zpracování mezer v sekvenčních datech pomocí interpolace
- Výchozí hodnoty: Přiřazení výchozích hodnot k volitelným polím
- Normalizace dat: Zajištění konzistentní datové struktury napříč dokumenty