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