运算符$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")
}
相关内容
- 查看有关 从 MongoDB 迁移到适用于 MongoDB 的 Azure Cosmos DB (vCore) 的选项。
- 详细了解 与 MongoDB 的功能兼容性。