$min演算子は、$group、$bucket、$bucketAuto、$setWindowFieldsなどの集計ステージ内で使用されます。 min 演算子は、データを集計したり、データセット内の最小値を見つけたりする場合に特に便利です。
フィールド更新演算子として使用する場合、 $min 演算子は、指定した値がフィールドの現在の値より小さい場合に、フィールドの値を指定した値に更新します。 フィールドが存在しない場合は、 $min フィールドを作成し、指定した値に設定します。
構文
$min: <expression>
<expression>には、最小計算で考慮する値を指定するフィールド パスまたは集計式を指定できます。
フィールド更新演算子として:
{
$min: {
<field1>: <value1>,
<field2>: <value2>,
...
}
}
パラメーター
| パラメーター | Description |
|---|---|
<expression> |
最小値を決定するフィールドまたは計算値を指定します。 |
フィールド更新演算子として:
| パラメーター | Description |
|---|---|
field |
最小値で更新するフィールドの名前。 |
value |
現在のフィールド値と比較する値。 フィールドは、この値が小さい場合にのみ更新されます。 |
例示
stores コレクションのこのサンプル ドキュメントについて考えてみましょう。
{
"_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: <の使用
このクエリでは、最初に販売カテゴリ別にドキュメントをグループ化し、次に各カテゴリ内の最小販売量を計算することで、 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 年の会社別の "ノート PC" の最小割引を取得します。
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: 最小スタッフ要件の設定 (フィールド更新演算子)
スタッフの最小要件を設定するには、フィールドの現在の値が高い場合にのみ、フルタイムの stagg カウントを更新します。 現在の 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")
}