$rank

El $rank operador asigna una clasificación a cada documento dentro de una partición de un conjunto de datos. La clasificación se determina en función de un criterio de ordenación especificado.

Syntax

{
    $setWindowFields: {
        partitionBy: < expression > ,
        sortBy: {
            < field >: < order >
        },
        output: {
            < outputField >: {
                $rank: {}
            }
        }
    }
}

Parámetros

Parámetro Description
partitionBy Especifica la expresión para agrupar documentos en particiones. Si se omite, todos los documentos se tratan como una sola partición.
sortBy Define el criterio de ordenación para la clasificación. Debe especificarse para $rank.
output Contiene el campo donde se almacena el valor de clasificación.

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: Clasificación de almacenes por volumen de ventas

Para clasificar todas las tiendas dentro de la empresa "First Up Consultants" por volumen de ventas, primero ejecute una consulta para dividir las tiendas dentro de la empresa. A continuación, ordene los almacenes resultantes en orden ascendente del volumen de ventas y use el operador $rank para clasificar los documentos ordenados en el conjunto de resultados.

db.stores.aggregate([{
    "$match": {
        "company": {
            "$in": ["First Up Consultants"]
        }
    }
}, {
    "$setWindowFields": {
        "partitionBy": "$company",
        "sortBy": {
            "sales.totalSales": -1
        },
        "output": {
            "rankBySales": {
                "$rank": {}
            }
        }
    }
}, {
    "$project": {
        "company": 1,
        "name": 1,
        "rankBySales": 1
    }
}])

Los tres primeros resultados devueltos por esta consulta son:

[
    {
        "_id": "a0386810-b6f8-4b05-9d60-e536fb2b0026",
        "name": "First Up Consultants | Electronics Stop - South Thelma",
        "company": "First Up Consultants",
        "rankBySales": 1
    },
    {
        "_id": "ad8af64a-d5bb-4162-9bb6-e5104126566d",
        "name": "First Up Consultants | Electronics Emporium - South Carmenview",
        "company": "First Up Consultants",
        "rankBySales": 2
    },
    {
        "_id": "39acb3aa-f350-41cb-9279-9e34c004415a",
        "name": "First Up Consultants | Bed and Bath Pantry - Port Antone",
        "company": "First Up Consultants",
        "rankBySales": 3
    }
]