$expr

$expr 运算符允许在查询语言中使用聚合表达式,这使我们可以比较同一文档中的字段、执行计算,并在查找作中使用聚合运算符。 该 $expr 运算符对于无法通过传统查询运算符实现的复杂字段比较非常有用。

语法

{
  $expr: { <aggregation expression> }
}

参数

参数 说明
<aggregation expression> 计算结果为布尔值的任何有效聚合表达式。 该表达式包括字段比较、算术运算、条件表达式和其他聚合运算符。

示例:

让我们了解 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": 19,
      "partTime": 20
    }
  },
  "sales": {
    "totalSales": 151864,
    "salesByCategory": [
      {
        "categoryName": "Sound Bars",
        "totalSales": 2120
      },
      {
        "categoryName": "Home Theater Projectors",
        "totalSales": 45004
      }
    ]
  },
  "storeOpeningDate": ISODate("2024-09-23T13:45:01.480Z"),
  "lastUpdated": ISODate("2025-06-11T11:06:57.922Z"),
  "status": "active",
  "category": "high-volume",
  "priority": 1,
  "reviewDate": ISODate("2025-06-11T11:10:50.276Z")
}

示例 1:比较全职和兼职员工

该示例检索全职员工数大于兼职员工的商店。

db.stores.find({"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
  $expr: {
    $gt: ["$staff.employeeCount.fullTime", "$staff.employeeCount.partTime"]
  }
})

该查询比较同一文档中的两个字段,如果满足条件,则返回该文档(全职员工计数超过兼职员工计数)。

{
  "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
  "name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
  "location": {
    "lat": 70.1272,
    "lon": 69.7296
  },
  "staff": {
    "totalStaff": {
      "fullTime": 19,
      "partTime": 20
    }
  },
  "sales": {
    "totalSales": 151864,
    "salesByCategory": [
      {
        "categoryName": "Sound Bars",
        "totalSales": 2120
      },
      {
        "categoryName": "Home Theater Projectors",
        "totalSales": 45004
      }
    ]
  },
  "storeOpeningDate": ISODate("2024-09-23T13:45:01.480Z"),
  "lastUpdated": ISODate("2025-06-11T11:06:57.922Z"),
  "status": "active",
  "category": "high-volume",
  "priority": 1,
  "reviewDate": ISODate("2025-06-11T11:10:50.276Z")
}

示例 2:具有存储位置的条件逻辑

该示例演示了南半球$expr拉取商店的条件逻辑使用情况,其中员工效率比率(每名员工的销售额)超过 2000。

db.stores.find({{"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
  $expr: {
    $and: [
      { $gte: ["$location.lat", 70.1272] },
      {
        $gt: [
          {
            $divide: [
              "$sales.totalSales",
              { $add: ["$staff.employeeCount.fullTime", "$staff.employeeCount.partTime"] }
            ]
          },
          2000
        ]
      }
    ]
  }
}).limit(1)

该查询将基于位置的筛选与计算效率指标相结合,演示了复杂业务逻辑的强大 $expr 功能。

{
  "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
  "name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
  "location": {
    "lat": 70.1272,
    "lon": 69.7296
  },
  "staff": {
    "totalStaff": {
      "fullTime": 19,
      "partTime": 20
    }
  },
  "sales": {
    "totalSales": 151864,
    "salesByCategory": [
      {
        "categoryName": "Sound Bars",
        "totalSales": 2120
      },
      {
        "categoryName": "Home Theater Projectors",
        "totalSales": 45004
      }
    ]
  },
  "storeOpeningDate": ISODate("2024-09-23T13:45:01.480Z"),
  "lastUpdated": ISODate("2025-06-11T11:06:57.922Z"),
  "status": "active",
  "category": "high-volume",
  "priority": 1,
  "reviewDate": ISODate("2025-06-11T11:10:50.276Z")
}