次の方法で共有


$min

$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")
}