$bottomN

El operador $bottomN ordena documentos en uno o varios campos especificados por la consulta y devuelve los últimos documentos N que coinciden con los criterios de filtrado.

Syntax

{
    $bottomN: {
        output: [listOfFields],
        sortBy: {
            <fieldName>: < sortOrder >
        },
        n: < numDocumentsToReturn >
    }
}

Parámetros

Parámetro Description
listOfFields Lista de campos que se van a devolver para el último documento del conjunto de resultados
fieldName Campo que se va a usar para ordenar el conjunto de resultados
sortOrder 1 o -1. 1 implica la ordenación en orden ascendente del valor del campo, mientras que -1 implica la ordenación en orden descendente de los valores del campo
n Número de documentos que se van a devolver desde la parte inferior del conjunto de resultados ordenado

Examples

Considere este documento de ejemplo de la colección de tiendas.

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

Ejemplo 1: Buscar los dos almacenes inferiores por ventas totales

Para determinar las dos tiendas de la empresa First Up Consultants con las ventas más bajas, ejecute una consulta para recuperar tiendas dentro de la empresa "First Up Consultants", ordene los documentos resultantes en orden descendente de ventas totales y devuelva los dos últimos documentos del conjunto de resultados ordenados.

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

Esta consulta devuelve el siguiente resultado:

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

Ejemplo 2: Buscar las dos categorías inferiores por ventas totales dentro de cada tienda

Para determinar las dos categorías de rendimiento más bajas por ventas totales dentro de cada tienda, ejecute una consulta para recuperar documentos con al menos dos categorías de ventas, ordene las categorías en orden descendente de ventas totales y, por último, devuelva las dos categorías inferiores por tienda.

db.stores.aggregate([{
    $unwind: "$sales.salesByCategory"
}, {
    $match: {
        "sales.salesByCategory.totalSales": {
            $exists: true
        }
    }
}, {
    $group: {
        _id: "$_id",
        storeName: {
            $first: "$name"
        },
        categoryCount: {
            $sum: 1
        },
        bottomTwoCategories: {
            $bottomN: {
                n: 2,
                sortBy: {
                    "sales.salesByCategory.totalSales": -1
                },
                output: {
                    categoryName: "$sales.salesByCategory.categoryName",
                    totalSales: "$sales.sale"
                }
            }
        }
    }
}, {
    $match: {
        categoryCount: {
            $gte: 2
        }
    }
}])

El primer resultado devuelto por esta consulta es:

[
    {
        "_id": "64ec6589-068a-44a6-be5b-9d37bb0a90f1",
        "storeName": "First Up Consultants | Computer Gallery - West Cathrine",
        "categoryCount": 8,
        "bottomTwoCategories": [
            {
                "categoryName": "Gaming Controllers",
                "totalSales": null
            },
            {
                "categoryName": "Network Adapters",
                "totalSales": null
            }
        ]
    }
]