$min

El $min operador se usa en fases de agregación como $group, $bucket, $bucketAutoo $setWindowFields. El operador min es especialmente útil para resumir los datos o encontrar el valor más pequeño de un conjunto de datos.

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

Syntax

$min: <expression>

<expression> puede ser una ruta de acceso de campo o una expresión de agregación que especifica los valores que se deben tener en cuenta para el cálculo mínimo.

Como operador de actualización de campo:

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

Parámetros

Parámetro Description
<expression> Especifica el campo o el valor calculado para determinar el valor mínimo.

Como operador de actualización de campo:

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

Examples

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

{
  "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
  "name": "Lakeshore Retail | DJ Equipment Stop - Port Cecile",
  "location": {
    "lat": 60.1441,
    "lon": -141.5012
  },
  "staff": {
    "totalStaff": {
      "fullTime": 2,
      "partTime": 0
    }
  },
  "sales": {
    "salesByCategory": [
      {
        "categoryName": "DJ Headphones",
        "totalSales": 35921
      }
    ],
    "fullSales": 3700
  },
  "promotionEvents": [
    {
      "eventName": "Bargain Blitz Days",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 3,
          "Day": 11
        },
        "endDate": {
          "Year": 2024,
          "Month": 2,
          "Day": 18
        }
      },
      "discounts": [
        {
          "categoryName": "DJ Turntables",
          "discountPercentage": 18
        },
        {
          "categoryName": "DJ Mixers",
          "discountPercentage": 15
        }
      ]
    }
  ],
  "tag": [
    "#ShopLocal",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ],
  "company": "Lakeshore Retail",
  "city": "Port Cecile",
  "lastUpdated": {
    "$date": "2024-12-11T10:21:58.274Z"
  }
}

Ejemplo 1: Usar $min en $group

Esta consulta calcula el valor mínimo de ventas de cada categoría de la sales.salesByCategory matriz agrupando primero los documentos por categoría de ventas y calculando el volumen de ventas mínimo dentro de cada categoría.

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

Esta consulta devuelve los siguientes resultados.

[
    {
        "_id": "Christmas Trees",
        "minSales": 391
    },
    {
        "_id": "Nuts",
        "minSales": 257
    },
    {
        "_id": "Camping Tables",
        "minSales": 171
    },
    {
        "_id": "Music Theory Books",
        "minSales": 323
    },
    {
        "_id": "Fortified Wine",
        "minSales": 521
    },
    {
        "_id": "Children's Mystery",
        "minSales": 1470
    },
    {
        "_id": "Short Throw Projectors",
        "minSales": 111
    },
    {
        "_id": "Pliers",
        "minSales": 1981
    },
    {
        "_id": "Bluetooth Headphones",
        "minSales": 465
    },
    {
        "_id": "Video Storage",
        "minSales": 1568
    },
    {
        "_id": "Cleansers",
        "minSales": 170
    },
    {
        "_id": "Camera Straps",
        "minSales": 127
    },
    {
        "_id": "Carry-On Bags",
        "minSales": 149
    },
    {
        "_id": "Disinfectant Wipes",
        "minSales": 647
    },
    {
        "_id": "Insignia Smart TVs",
        "minSales": 451
    },
    {
        "_id": "Toner Refill Kits",
        "minSales": 3525
    },
    {
        "_id": "iPads",
        "minSales": 325
    },
    {
        "_id": "Storage Baskets",
        "minSales": 1151
    },
    {
        "_id": "Memory Foam Mattresses",
        "minSales": 422
    },
    {
        "_id": "Body Spray",
        "minSales": 448
    }
]

Ejemplo 2: Usar $min en $bucket

Esta consulta crea cubos basados en valores de ventas y calcula el valor de ventas mínimo para cada cubo.

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

Esta consulta devuelve los siguientes resultados.

[
    {
        "_id": 1000,
        "minSales": 1000
    },
    {
        "_id": "Other",
        "minSales": null
    },
    {
        "_id": 0,
        "minSales": 108
    },
    {
        "_id": 5000,
        "minSales": 5001
    }
]

Ejemplo 3: Usar $min en $setWindowFields

Esta consulta recupera el descuento mínimo para "Portátiles" por empresa, en el año 2023:

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: {
                minDiscount: {
                    $min: "$promotionEvents.discounts.discountPercentage",
                    window: {
                        documents: ["unbounded", "unbounded"]
                    }
                }
            }
        }
    },

    // Group by city to return one result per city
    {
        $group: {
            _id: "$company",
            minDiscount: {
                $first: "$minDiscount"
            }
        }
    }
])

Esta consulta devuelve los siguientes resultados.

[
    {
        "_id": "VanArsdel, Ltd.",
        "minDiscount": 6
    },
    {
        "_id": "Proseware, Inc.",
        "minDiscount": 8
    },
    {
        "_id": "Fabrikam, Inc.",
        "minDiscount": 5
    },
    {
        "_id": "Contoso, Ltd.",
        "minDiscount": 5
    },
    {
        "_id": "Fourth Coffee",
        "minDiscount": 6
    },
    {
        "_id": "Trey Research",
        "minDiscount": 7
    },
    {
        "_id": "Adatum Corporation",
        "minDiscount": 5
    },
    {
        "_id": "Relecloud",
        "minDiscount": 5
    },
    {
        "_id": "Lakeshore Retail",
        "minDiscount": 7
    },
    {
        "_id": "Northwind Traders",
        "minDiscount": 8
    },
    {
        "_id": "First Up Consultants",
        "minDiscount": 9
    },
    {
        "_id": "Wide World Importers",
        "minDiscount": 10
    },
    {
        "_id": "Tailwind Traders",
        "minDiscount": 5
    }
]

Ejemplo 4: Establecer los requisitos mínimos del personal (operador de actualización de campo)

Para establecer un requisito mínimo del personal, actualice el recuento de agregados de tiempo completo solo si el valor actual del campo es mayor. Dado que el valor actual fullTime es 14 y 10 es menor que 14, el campo se actualizará a 10.

db.stores.updateOne(
  { _id: "26afb024-53c7-4e94-988c-5eede72277d5" },
  {
    $min: {
      "staff.totalStaff.fullTime": 10
    }
  }
)

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

Para actualizar varios campos con valores mínimos simultáneamente, use el operador $min con varios campos y los valores mínimos correspondientes.

db.stores.updateOne(
  { _id: "26afb024-53c7-4e94-988c-5eede72277d5" },
  {
    $min: {
      "staff.totalStaff.partTime": 12,
      "sales.totalSales": 50000
    }
  }
)

En este caso:

  • partTime (8) se actualizará a 8 desde 12 > 8 (sin cambios)
  • totalSales (83865) se actualizará a 50000 desde 50000 < 83865

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

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

db.stores.updateOne(
  { _id: "26afb024-53c7-4e94-988c-5eede72277d5" },
  {
    $min: {
      "staff.minStaffRequired": 15,
      "sales.minimumSalesTarget": 30000
    }
  }
)

Ejemplo 7: Trabajar con fechas (operador de actualización de campo)

Establezca fechas mínimas para realizar el seguimiento de los eventos más antiguos.

db.stores.updateOne(
  { _id: "26afb024-53c7-4e94-988c-5eede72277d5" },
  {
    $min: {
      "lastInventoryCheck": new Date("2024-01-15"),
      "firstSaleDate": new Date("2023-06-01")
    }
  }
)

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

Actualice los valores mínimos dentro de los elementos de matriz mediante operadores posicionales.

db.stores.updateOne(
  {
    _id: "26afb024-53c7-4e94-988c-5eede72277d5",
    "sales.salesByCategory.categoryName": "Lavalier Microphones"
  },
  {
    $min: {
      "sales.salesByCategory.$.totalSales": 40000
    }
  }
)

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

{
  "_id": "26afb024-53c7-4e94-988c-5eede72277d5",
  "name": "First Up Consultants | Microphone Bazaar - South Lexusland",
  "staff": {
    "totalStaff": {
      "fullTime": 10,
      "partTime": 8
    },
    "minStaffRequired": 15
  },
  "sales": {
    "totalSales": 50000,
    "minimumSalesTarget": 30000,
    "salesByCategory": [
      {
        "categoryName": "Lavalier Microphones",
        "totalSales": 40000
      },
      {
        "categoryName": "Wireless Microphones",
        "totalSales": 39691
      }
    ]
  },
  "lastInventoryCheck": ISODate("2024-01-15T00:00:00.000Z"),
  "firstSaleDate": ISODate("2023-06-01T00:00:00.000Z")
}