$max

El $max operador devuelve el valor máximo de un conjunto de valores de entrada.

Cuando se usa como operador de actualización de campo, el $max operador actualiza el valor de un campo a un valor especificado si el valor especificado es mayor que el valor actual del campo. Si el campo no existe, $max crea el campo y lo establece en el valor especificado.

Syntax

$max: <expression>

Cuando se usa como operador de actualización de campo:

{
  $max: {
    <field1>: <value1>,
    <field2>: <value2>,
    ...
  }
}

Parámetros

Parámetro Description
<expression> Cualquier expresión válida que se resuelva en un valor. El $max operador evalúa esta expresión para determinar el valor máximo.

Cuando se usa como operador de actualización de campo:

Parámetro Description
field Nombre del campo que se va a actualizar con el valor máximo.
value Valor que se va a comparar con el valor de campo actual. El campo se actualizará solo si este valor es mayor.

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: Cálculo de las ventas más altas por categoría

Para calcular las ventas más altas dentro de cada categoría, primero ejecute una consulta para agrupar todos los documentos por categoría de ventas. A continuación, ejecute una consulta $max para recuperar las ventas más altas dentro de cada categoría en todas las tiendas.

db.stores.aggregate([{
        $unwind: "$sales.salesByCategory"
    },
    {
        $group: {
            _id: "$sales.salesByCategory.categoryName",
            maxSales: {
                $max: "$sales.salesByCategory.totalSales"
            }
        }
    }
])

Los cinco primeros resultados devueltos por esta consulta son:

[
    {
        "_id": "Christmas Trees",
        "maxSales": 49697
    },
    {
        "_id": "Nuts",
        "maxSales": 48020
    },
    {
        "_id": "Camping Tables",
        "maxSales": 48568
    },
    {
        "_id": "Music Theory Books",
        "maxSales": 46133
    },
    {
        "_id": "Fortified Wine",
        "maxSales": 49912
    }
]

Ejemplo 2: Usar $max en $bucket

Para recuperar las ventas más altas dentro de cubos de límites de ventas:

db.stores.aggregate([{
    $bucket: {
        groupBy: "$sales.totalSales",
        boundaries: [0, 1000, 5000, 10000],
        default: "Other",
        output: {
            maxSales: {
                $max: "$sales.totalSales"
            }
        }
    }
}])

Esta consulta devuelve los siguientes resultados:

[
    {
        "_id": 1000,
        "maxSales": 4996
    },
    {
        "_id": "Other",
        "maxSales": 404106
    },
    {
        "_id": 0,
        "maxSales": 995
    },
    {
        "_id": 5000,
        "maxSales": 9999
    }
]

Ejemplo 3: Usar $max en $setWindowFields

Para obtener el mayor descuento para portátiles en 2023, primero ejecute una consulta para desenredar solo eventos de promoción y filtrar por la categoría elegida. A continuación, particione los documentos resultantes por la empresa y calcule el porcentaje de descuento más alto dentro de cada partición resultante.

db.stores.aggregate([{
        $unwind: "$promotionEvents"
    },
    {
        $unwind: "$promotionEvents.discounts"
    },
    // Filter only Laptops category and events in 2023
    {
        $match: {
            "promotionEvents.promotionalDates.startDate.Year": 2023,
            "promotionEvents.discounts.categoryName": "Laptops"
        }
    },
    // Use $setWindowFields to calculate average discount by city
    {
        $setWindowFields: {
            partitionBy: "$company",
            output: {
                maxDiscount: {
                    $max: "$promotionEvents.discounts.discountPercentage",
                    window: {
                        documents: ["unbounded", "unbounded"]
                    }
                }
            }
        }
    },
    // Group by city to return one result per city
    {
        $group: {
            _id: "$company",
            maxDiscount: {
                $first: "$maxDiscount"
            }
        }
    }
])

Los tres primeros resultados devueltos por esta consulta son:

[
    {
        "_id": "Proseware, Inc.",
        "maxDiscount": 24
    },
    {
        "_id": "Fabrikam, Inc.",
        "maxDiscount": 23
    },
    {
        "_id": "Contoso, Ltd.",
        "maxDiscount": 24
    }
]

Ejemplo 4: Establecimiento de la capacidad máxima del personal (operador de actualización de campo)

Para actualizar el personal de tiempo completo a 10 solo si el número de personal de tiempo completo actual es inferior, use el operador $max en el campo para realizar la actualización. Dado que el valor actual fullTime es 3 y 10 es mayor que 3, el campo se actualizará a 10.

db.stores.updateOne(
  { _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66" },
  {
    $max: {
      "staff.totalStaff.fullTime": 10
    }
  }
)

Ejemplo 5: Varias actualizaciones de campo (operador de actualización de campo)

Para actualizar varios campos con valores máximos, use el operador $max con varios campos y sus valores máximos correspondientes que se van a establecer.

db.stores.updateOne(
  { _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66" },
  {
    $max: {
      "staff.totalStaff.partTime": 1,
      "sales.totalSales": 50000
    }
  }
)

En este caso:

  • partTime (2) permanecerán 2 desde 1 < 2 (sin cambios)
  • totalSales (31211) se actualizará a 50000 desde 50000 > 31211

Ejemplo 6: Crear nuevos campos (operador de actualización de campos)

Si no existe un campo, $max lo crea con el valor especificado.

db.stores.updateOne(
  { _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66" },
  {
    $max: {
      "staff.maxStaffCapacity": 25,
      "sales.peakSalesRecord": 100000
    }
  }
)

Ejemplo 7: Actualización de elementos de matriz (operador de actualización de campo)

Actualice los valores máximos dentro de los elementos de matriz mediante operadores posicionales.

db.stores.updateOne(
  {
    _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66",
    "sales.salesByCategory.categoryName": "Phone Mounts"
  },
  {
    $max: {
      "sales.salesByCategory.$.totalSales": 12000
    }
  }
)

Ejemplo 8: Seguimiento del rendimiento máximo (operador de actualización de campo)

Establezca métricas de rendimiento máximas que solo se actualicen cuando se superen.

db.stores.updateOne(
  { _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66" },
  {
    $max: {
      "performance.peakDailySales": 5000,
      "performance.maxCustomersPerDay": 150,
      "performance.highestSalesMonth": 45000
    }
  }
)

Después de estas operaciones de actualización de campo, el documento actualizado es:

{
  "_id": "f2a8c190-28e4-4e14-9d8b-0256e53dca66",
  "name": "Fabrikam, Inc. | Car Accessory Outlet - West Adele",
  "staff": {
    "totalStaff": {
      "fullTime": 10,
      "partTime": 2
    },
    "maxStaffCapacity": 25
  },
  "sales": {
    "totalSales": 50000,
    "peakSalesRecord": 100000,
    "salesByCategory": [
      {
        "categoryName": "Phone Mounts",
        "totalSales": 12000
      },
      {
        "categoryName": "Dash Cameras",
        "totalSales": 22300
      }
    ]
  },
  "performance": {
    "peakDailySales": 5000,
    "maxCustomersPerDay": 150,
    "highestSalesMonth": 45000
  },
  "lastPromotionDate": ISODate("2024-12-31T00:00:00.000Z"),
  "inventoryDeadline": ISODate("2024-06-30T00:00:00.000Z")
}