$max

연산자는 $max 입력 값 집합의 최대값을 반환합니다.

필드 업데이트 연산 $max 자로 사용되는 경우 지정된 값이 필드의 현재 값보다 큰 경우 연산자는 필드 값을 지정된 값으로 업데이트합니다. 필드가 없 $max 으면 필드를 만들고 지정된 값으로 설정합니다.

문법

$max: <expression>

필드 업데이트 연산자로 사용되는 경우:

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

매개 변수

매개 변수 Description
<expression> 값으로 확인되는 유효한 식입니다. $max 연산자는 이 식을 평가하여 최대값을 결정합니다.

필드 업데이트 연산자로 사용되는 경우:

매개 변수 Description
field 최대값으로 업데이트할 필드의 이름입니다.
value 현재 필드 값과 비교할 값입니다. 이 값이 더 큰 경우에만 필드가 업데이트됩니다.

예시

스토어 컬렉션에서 이 샘플 문서를 고려합니다.

{
    "_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
    "name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
    "location": {
        "lat": -89.2384,
        "lon": -46.4012
    },
    "staff": {
        "totalStaff": {
            "fullTime": 8,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 75670,
        "salesByCategory": [
            {
                "categoryName": "Wine Accessories",
                "totalSales": 34440
            },
            {
                "categoryName": "Bitters",
                "totalSales": 39496
            },
            {
                "categoryName": "Rum",
                "totalSales": 1734
            }
        ]
    },
    "promotionEvents": [
        {
            "eventName": "Unbeatable Bargain Bash",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 6,
                    "Day": 23
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 7,
                    "Day": 2
                }
            },
            "discounts": [
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 7
                },
                {
                    "categoryName": "Bitters",
                    "discountPercentage": 15
                },
                {
                    "categoryName": "Brandy",
                    "discountPercentage": 8
                },
                {
                    "categoryName": "Sports Drinks",
                    "discountPercentage": 22
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 19
                }
            ]
        },
        {
            "eventName": "Steal of a Deal Days",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 21
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 29
                }
            },
            "discounts": [
                {
                    "categoryName": "Organic Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "White Wine",
                    "discountPercentage": 20
                },
                {
                    "categoryName": "Sparkling Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 17
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 23
                }
            ]
        }
    ]
}

예제 1: 범주별 가장 높은 판매액 계산

각 범주 내에서 가장 높은 매출을 계산하려면 먼저 쿼리를 실행하여 모든 문서를 판매 범주별로 그룹화합니다. 그런 다음 $max 쿼리를 실행하여 모든 저장소에서 각 범주 내에서 가장 높은 매출을 검색합니다.

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

이 쿼리에서 반환된 처음 5개의 결과는 다음과 같습니다.

[
    {
        "_id": "Christmas Trees",
        "maxSales": 49697
    },
    {
        "_id": "Nuts",
        "maxSales": 48020
    },
    {
        "_id": "Camping Tables",
        "maxSales": 48568
    },
    {
        "_id": "Music Theory Books",
        "maxSales": 46133
    },
    {
        "_id": "Fortified Wine",
        "maxSales": 49912
    }
]

예제 2: 다음에서 사용 $max$bucket

판매 경계의 버킷 내에서 가장 높은 매출을 검색하려면 다음을 수행합니다.

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

이 쿼리는 다음 결과를 반환합니다.

[
    {
        "_id": 1000,
        "maxSales": 4996
    },
    {
        "_id": "Other",
        "maxSales": 404106
    },
    {
        "_id": 0,
        "maxSales": 995
    },
    {
        "_id": 5000,
        "maxSales": 9999
    }
]

예제 3: 사용 $max$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: {
                maxDiscount: {
                    $max: "$promotionEvents.discounts.discountPercentage",
                    window: {
                        documents: ["unbounded", "unbounded"]
                    }
                }
            }
        }
    },
    // Group by city to return one result per city
    {
        $group: {
            _id: "$company",
            maxDiscount: {
                $first: "$maxDiscount"
            }
        }
    }
])

이 쿼리에서 반환된 처음 세 가지 결과는 다음과 같습니다.

[
    {
        "_id": "Proseware, Inc.",
        "maxDiscount": 24
    },
    {
        "_id": "Fabrikam, Inc.",
        "maxDiscount": 23
    },
    {
        "_id": "Contoso, Ltd.",
        "maxDiscount": 24
    }
]

예제 4: 최대 직원 용량 설정(필드 업데이트 연산자)

현재 정규직 직원 수가 낮은 경우에만 정규직 직원을 10으로 업데이트하려면 필드에서 $max 연산자를 사용하여 업데이트를 수행합니다. 현재 fullTime 값은 3이고 10은 3보다 크므로 필드는 10으로 업데이트됩니다.

db.stores.updateOne(
  { _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66" },
  {
    $max: {
      "staff.totalStaff.fullTime": 10
    }
  }
)

예제 5: 여러 필드 업데이트(필드 업데이트 연산자)

최대값으로 여러 필드를 업데이트하려면 여러 필드와 해당 최대값이 있는 $max 연산자를 사용하여 설정합니다.

db.stores.updateOne(
  { _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66" },
  {
    $max: {
      "staff.totalStaff.partTime": 1,
      "sales.totalSales": 50000
    }
  }
)

이 경우 다음과 같습니다.

  • partTime (2)는 1 < 2 이후 2로 유지됩니다(변경 없음).
  • totalSales (31211)는 50000 31211 이후 50000으로 > 업데이트됩니다.

예제 6: 새 필드 만들기(필드 업데이트 연산자)

필드가 없 $max 으면 지정된 값으로 필드를 만듭니다.

db.stores.updateOne(
  { _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66" },
  {
    $max: {
      "staff.maxStaffCapacity": 25,
      "sales.peakSalesRecord": 100000
    }
  }
)

예제 7: 배열 요소 업데이트(필드 업데이트 연산자)

위치 연산자를 사용하여 배열 요소 내의 최대값을 업데이트합니다.

db.stores.updateOne(
  {
    _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66",
    "sales.salesByCategory.categoryName": "Phone Mounts"
  },
  {
    $max: {
      "sales.salesByCategory.$.totalSales": 12000
    }
  }
)

예제 8: 최대 성능 추적(필드 업데이트 연산자)

초과할 때만 업데이트되는 최고 성능 메트릭을 설정합니다.

db.stores.updateOne(
  { _id: "f2a8c190-28e4-4e14-9d8b-0256e53dca66" },
  {
    $max: {
      "performance.peakDailySales": 5000,
      "performance.maxCustomersPerDay": 150,
      "performance.highestSalesMonth": 45000
    }
  }
)

이러한 필드 업데이트 작업 후에 업데이트된 문서는 다음과 같습니다.

{
  "_id": "f2a8c190-28e4-4e14-9d8b-0256e53dca66",
  "name": "Fabrikam, Inc. | Car Accessory Outlet - West Adele",
  "staff": {
    "totalStaff": {
      "fullTime": 10,
      "partTime": 2
    },
    "maxStaffCapacity": 25
  },
  "sales": {
    "totalSales": 50000,
    "peakSalesRecord": 100000,
    "salesByCategory": [
      {
        "categoryName": "Phone Mounts",
        "totalSales": 12000
      },
      {
        "categoryName": "Dash Cameras",
        "totalSales": 22300
      }
    ]
  },
  "performance": {
    "peakDailySales": 5000,
    "maxCustomersPerDay": 150,
    "highestSalesMonth": 45000
  },
  "lastPromotionDate": ISODate("2024-12-31T00:00:00.000Z"),
  "inventoryDeadline": ISODate("2024-06-30T00:00:00.000Z")
}