你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

$let (变量表达式)

适用对象: MongoDB vCore

运算符 $let 用于定义要在指定表达式中使用的变量。 它允许你创建可在表达式中引用的临时变量,使复杂的计算更易于读取并防止冗余计算。

语法

运算符的 $isArray 语法如下所示:

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

参数

DESCRIPTION
vars 一个定义变量及其值的对象。 为每个变量分配表达式的结果。
in 使用对象中定义的变量的 vars 表达式。 使用 $$<variable_name>. 引用变量。

示例:

让我们了解 stores 数据集中的示例 json 的用法。

{
  "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
  "name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
  "location": {
    "lat": 70.1272,
    "lon": 69.7296
  },
  "staff": {
    "totalStaff": {
      "fullTime": 5,
      "partTime": 20
    }
  },
  "sales": {
    "totalSales": 151864,
    "salesByCategory": [
      {
        "categoryName": "Sound Bars",
        "totalSales": 2120
      },
      {
        "categoryName": "Home Theater Projectors",
        "totalSales": 45004
      },
      {
        "categoryName": "Game Controllers",
        "totalSales": 43522
      },
      {
        "categoryName": "Remote Controls",
        "totalSales": 28946
      },
      {
        "categoryName": "VR Games",
        "totalSales": 32272
      }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Discount Delight Days",
      "promotionalDates": {
        "startDate": {
          "Year": 2023,
          "Month": 12,
          "Day": 26
        },
        "endDate": {
          "Year": 2024,
          "Month": 1,
          "Day": 5
        }
      },
      "discounts": [
        {
          "categoryName": "Game Controllers",
          "discountPercentage": 22
        },
        {
          "categoryName": "Home Theater Projectors",
          "discountPercentage": 23
        }
      ]
    }
  ]
}

示例 1:基本变量用法

使用定义的变量计算员工效率指标。

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

这将生成以下输出:

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

示例 2:嵌套$let表达式

使用嵌套变量定义计算基于位置的见解。

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

这将使用嵌套计算生成全面的位置分析。

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