$botten

Operatorn $bottom sorterar dokument på ett eller flera fält som anges av frågan och returnerar det sista dokumentet som matchar filtreringsvillkoren.

Syntax

{
    $bottom: {
        output: [listOfFields],
        sortBy: {
            <fieldName>: < sortOrder >
        }
    }
}

Parameterar

Parameter Description
listOfFields Listan över fält som ska returneras från det sista dokumentet i resultatuppsättningen
fieldName Fältet som ska användas för att sortera resultatuppsättningen
sortOrder 1 eller -1. 1 innebär sortering i stigande ordning på värdet för fältet medan -1 innebär sortering i fallande ordning efter värdena i fältet

Examples

Överväg det här exempeldokumentet från butiksamlingen.

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

Exempel 1: Hitta butiken med lägst total försäljning

Anta att vi vill fastställa butiken i företaget First Up Consultants med den lägsta totala försäljningen, köra en fråga för att hämta dokument i first up consultants-företaget, sortera dokumenten i fallande ordning efter total försäljning och returnera det sista dokumentet i den sorterade resultatuppsättningen.

db.stores.aggregate([{
    $match: {
        company: {
            $in: ["First Up Consultants"]
        }
    }
}, {
    $group: {
        _id: "$company",
        bottomSales: {
            $bottom: {
                output: ["$company", "$sales"],
                sortBy: {
                    "sales.revenue": -1
                }
            }
        }
    }
}])

Den här frågan returnerar följande resultat:

[
  {
    "_id": "First Up Consultants",
    "bottomSales": [
        "First Up Consultants",
        {
            "totalSales": 119,
            "salesByCategory": [
                {
                    "categoryName": "Skirts",
                    "totalSales": 109
                }
            ]
        }
    ]
}]

Exempel 2: Hitta kategorin per butik med lägst försäljning

Om du vill hitta kategorin med den lägsta försäljningen per butik kör du en fråga för att hämta butiker med flera försäljningskategorier, sortera kategorierna i fallande ordning efter total försäljning i varje butik och returnera det sista dokumentet i den sorterade resultatuppsättningen.

db.stores.aggregate([{
        $unwind: "$sales.salesByCategory"
    },
    {
        $match: {
            "sales.salesByCategory.totalSales": {
                $exists: true
            }
        }
    },
    {
        $group: {
            _id: "$_id",
            storeName: {
                $first: "$name"
            },
            lowestCategory: {
                $bottom: {
                    sortBy: {
                        "sales.salesByCategory.totalSales": 1
                    },
                    output: {
                        categoryName: "$sales.salesByCategory.categoryName",
                        totalSales: "$sales.salesByCategory.totalSales"
                    }
                }
            }
        }
    }
])

De första två resultaten som returneras av den här frågan är:

[
  {
    "_id": "b1d86d1f-8705-4157-b64c-a9eda0df4921",
    "storeName": "VanArsdel, Ltd. | Baby Products Haven - West Kingfort",
    "lowestCategory": { "categoryName": "Baby Monitors", "totalSales": 49585 }
  },
  {
    "_id": "22e6367e-8341-415f-9795-118d2b522abf",
    "storeName": "Adatum Corporation | Outdoor Furniture Mart - Port Simone",
    "lowestCategory": { "categoryName": "Outdoor Benches", "totalSales": 4976 }
  }
]