$min

运算符$min在聚合阶段(如$group$bucket$bucketAuto$setWindowFields)中使用。 min 运算符在汇总数据或查找数据集中的最小值时特别有用。

当用作字段更新运算符时,如果指定的值小于字段的当前值, $min 运算符会将字段的值更新为指定的值。 如果该字段不存在, $min 请创建字段并将其设置为指定值。

语法

$min: <expression>

<expression>可以是字段路径或聚合表达式,用于指定要考虑进行最小计算的值。

作为字段更新运算符:

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

参数

参数 DESCRIPTION
<expression> 指定用于确定最小值的字段或计算值。

作为字段更新运算符:

参数 DESCRIPTION
field 要以最小值更新的字段的名称。
value 要与当前字段值进行比较的值。 仅当此值较小时,才会更新字段。

例子

请考虑存储集合中的此示例文档。

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

示例 1:使用$min$group

此查询先按销售类别对文档进行分组,然后计算每个类别中的最小销售量,从而计算数组中每个类别的 sales.salesByCategory 最小销售值。

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

此查询返回以下结果。

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

示例 2:使用$min$bucket

此查询基于销售值创建存储桶,并计算每个存储桶的最小销售值。

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

此查询返回以下结果。

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

示例 3:使用$min$setWindowFields

在 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"
            }
        }
    }
])

此查询返回以下结果。

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

示例 4:设置最低员工要求(现场更新操作员)

若要设置最低员工要求,请仅在字段的当前值较高时更新全职停滞计数。 由于当前 fullTime 值为 14,并且 10 小于 14,因此字段将更新为 10。

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

示例 5:多个字段更新(字段更新运算符)

若要同时更新具有最小值的多个字段,请使用具有多个字段和相应最小值的 $min 运算符。

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

在这种情况下:

  • partTime (8) 自 12 > 8 日起更新为 8 (无变化)
  • totalSales(83865) 自 50000 83865 起将更新为 50000 <

示例 6:创建新字段(字段更新运算符)

如果字段不存在, $min 请使用指定的值创建它。

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

示例 7:使用日期(字段更新运算符)

设置跟踪最早事件的最小日期。

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

示例 8:更新数组元素(字段更新运算符)

使用位置运算符更新数组元素中的最小值。

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

在这些字段更新作之后,更新的文档为:

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