$max

işleci $max , giriş değerleri kümesinin en yüksek değerini döndürür.

Alan güncelleştirme işleci olarak kullanıldığında, $max belirtilen değer alanın geçerli değerinden büyükse, işleç bir alanın değerini belirtilen değerle güncelleştirir. Alan yoksa, $max alanı oluşturur ve belirtilen değere ayarlar.

Sözdizimi

$max: <expression>

Alan güncelleştirme işleci olarak kullanıldığında:

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

Parametreler

Parametre Description
<expression> Bir değere çözümleyen geçerli ifadeler. işleci, $max en yüksek değeri belirlemek için bu ifadeyi değerlendirir.

Alan güncelleştirme işleci olarak kullanıldığında:

Parametre Description
field En yüksek değerle güncelleştirilecek alanın adı.
value Geçerli alan değeriyle karşılaştıracak değer. Alan yalnızca bu değer daha büyükse güncelleştirilir.

Örnekler

Stores koleksiyonundaki bu örnek belgeyi göz önünde bulundurun.

{
    "_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
                }
            ]
        }
    ]
}

Örnek 1: Kategoriye göre en yüksek satışları hesaplama

Her kategorideki en yüksek satışları hesaplamak için, önce tüm belgeleri satış kategorisine göre gruplandırmak için bir sorgu çalıştırın. Ardından tüm mağazalarda her kategorideki en yüksek satışları almak için bir $max sorgusu çalıştırın.

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

Bu sorgu tarafından döndürülen ilk beş sonuç şunlardır:

[
    {
        "_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
    }
]

Örnek 2: içinde kullanma $max$bucket

Satış sınırları demetleri içinde en yüksek satışları almak için:

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

Bu sorgu aşağıdaki sonuçları döndürür:

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

Örnek 3: içinde kullanma $max$setWindowFields

2023'te dizüstü bilgisayarlarda en yüksek indirimi elde etmek için öncelikle yalnızca promosyon etkinliklerini geri almak ve seçilen kategoriye göre filtrelemek için bir sorgu çalıştırın. Ardından elde edilen belgeleri şirkete göre bölümleyin ve sonuçta elde edilen her bölüm içindeki en yüksek indirim yüzdesini hesaplayın.

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

Bu sorgu tarafından döndürülen ilk üç sonuç şunlardır:

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

Örnek 4: Personel kapasitesinin üst sınırını ayarlama (alan güncelleştirme operatörü)

Tam zamanlı personeli yalnızca geçerli tam zamanlı personel sayısı düşükse 10 olarak güncelleştirmek için, güncelleştirmeyi gerçekleştirmek için alandaki $max işlecini kullanın. Geçerli fullTime değer 3 ve 10 3'ten büyük olduğundan, alan 10'a güncelleştirilir.

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

Örnek 5: Birden çok alan güncelleştirmesi (alan güncelleştirme işleci)

Birden çok alanı en yüksek değerlerle güncelleştirmek için, birden çok alan içeren $max işlecini ve bunların ayarlanacağı en yüksek değerleri kullanın.

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

Bu durumda:

  • partTime (2) 12'den < beri 2 kalacak (değişiklik yok)
  • totalSales (31211) 50000 31211 tarihinden itibaren 50000 olarak > güncelleştirilecek

Örnek 6: Yeni alanlar oluşturma (alan güncelleştirme işleci)

Bir alan yoksa, $max belirtilen değerle oluşturur.

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

Örnek 7: Dizi öğelerini güncelleştirme (alan güncelleştirme işleci)

Konumsal işleçleri kullanarak dizi öğeleri içindeki en yüksek değerleri güncelleştirin.

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

Örnek 8: En yüksek performansı izleme (alan güncelleştirme işleci)

Yalnızca aşıldığında güncelleştirilen en yüksek performans ölçümlerini ayarlayın.

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

Bu alan güncelleştirme işlemlerden sonra güncelleştirilmiş belge şu şekildedir:

{
  "_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")
}