$let

De $let operator wordt gebruikt om variabelen te definiëren voor gebruik in een opgegeven expressie. Hiermee kunt u tijdelijke variabelen maken waarnaar in de expressie kan worden verwezen, waardoor complexe berekeningen beter leesbaar worden en overbodige berekeningen worden voorkomen.

Syntaxis

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

Parameterwaarden

Kenmerk Description
vars Een object dat de variabelen en de bijbehorende waarden definieert. Aan elke variabele wordt het resultaat van een expressie toegewezen.
in De expressie die gebruikmaakt van de variabelen die zijn gedefinieerd in het vars object. Er wordt naar variabelen verwezen met behulp van $$<variable_name>.

Voorbeelden

Bekijk dit voorbeelddocument uit de winkelverzameling.

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

Voorbeeld 1: Basisvariabelegebruik

Bereken metrische gegevens over de efficiëntie van medewerkers met behulp van gedefinieerde variabelen.

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

Deze query retourneert het volgende resultaat.

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

Voorbeeld 2: Geneste $let expressies

Inzichten op basis van locatie berekenen met geneste variabeledefinities.

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

Deze query retourneert het volgende resultaat.

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