$let

Operator $let digunakan untuk menentukan variabel untuk digunakan dalam ekspresi tertentu. Ini memungkinkan Anda untuk membuat variabel sementara yang dapat direferensikan dalam ekspresi, membuat perhitungan kompleks lebih mudah dibaca dan mencegah komputasi redundan.

Syntax

{
  $let: {
    vars: { 
      <var1>: <expression1>,
      <var2>: <expression2>,
      ...
    },
    in: <expression>
  }
}

Parameter-parameternya

Pengaturan Description
vars Objek yang menentukan variabel dan nilainya. Setiap variabel diberi hasil ekspresi.
in Ekspresi yang menggunakan variabel yang ditentukan dalam vars objek. Variabel dirujuk menggunakan $$<variable_name>.

Examples

Pertimbangkan dokumen sampel ini dari koleksi toko.

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

Contoh 1: Penggunaan variabel dasar

Menghitung metrik efisiensi staf menggunakan variabel yang ditentukan.

db.stores.aggregate([
  { $match: {"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74"} },
  {
    $project: {
      name: 1,
      staffMetrics: {
        $let: {
          vars: {
            fullTime: "$staff.totalStaff.fullTime",
            partTime: "$staff.totalStaff.partTime",
            totalSales: "$sales.totalSales"
          },
          in: {
            totalStaff: { $add: ["$$fullTime", "$$partTime"] },
            salesPerEmployee: { $divide: ["$$totalSales", { $add: ["$$fullTime", "$$partTime"] }] },
            fullTimeRatio: { $divide: ["$$fullTime", { $add: ["$$fullTime", "$$partTime"] }] }
          }
        }
      }
    }
  }
])

Kueri ini mengembalikan hasil berikut.

[
  {
    "_id": '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    "name": 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    "staffMetrics": {
      "totalStaff": 39,
      "salesPerEmployee": 3893.948717948718,
      "fullTimeRatio": 0.5128205128205128
    }
  }
]

Contoh 2: Ekspresi $let berlapis

Hitung wawasan berbasis lokasi dengan definisi variabel berlapis.

db.stores.aggregate([
  { $match: {"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74"} },
  {
    $project: {
      name: 1,
      locationInsights: {
        $let: {
          vars: {
            lat: "$location.lat",
            lon: "$location.lon"
          },
          in: {
            coordinates: { lat: "$$lat", lon: "$$lon" },
            hemisphere: {
              $let: {
                vars: {
                  northSouth: { $cond: [{ $gte: ["$$lat", 0] }, "North", "South"] },
                  eastWest: { $cond: [{ $gte: ["$$lon", 0] }, "East", "West"] }
                },
                in: {
                  latitudeHemisphere: "$$northSouth",
                  longitudeHemisphere: "$$eastWest",
                  quadrant: { $concat: ["$$northSouth", " ", "$$eastWest"] }
                }
              }
            },
            distanceFromEquator: { $abs: "$$lat" },
            distanceFromPrimeMeridian: { $abs: "$$lon" }
          }
        }
      }
    }
  }
])

Kueri ini mengembalikan hasil berikut.

[
  {
    "_id": '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    "name": 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    "locationInsights": {
      "coordinates": { "lat": 70.1272, "lon": 69.7296 },
      "hemisphere": {
        "latitudeHemisphere": 'North',
        "longitudeHemisphere": 'East',
        "quadrant": 'North East'
      },
      "distanceFromEquator": 70.1272,
      "distanceFromPrimeMeridian": 69.7296
    }
  }
]