Dela via


$expr (utvärderingsfråga)

GÄLLER FÖR: MongoDB vCore

Operatorn $expr tillåter användning av aggregeringsuttryck inom frågespråket, vilket gör att vi kan jämföra fält från samma dokument, utföra beräkningar och använda aggregeringsoperatorer i sökåtgärder. Operatorn $expr är användbar för komplexa fältjämförelser som inte kan uppnås med traditionella frågeoperatorer.

Syntax

Syntaxen för operatorn $isArray är följande:

{
  $expr: { <aggregation expression> }
}

Parametrar

beskrivning
<aggregation expression> Alla giltiga aggregeringsuttryck som utvärderas till ett booleskt värde. Uttrycket innehåller fältjämförelser, aritmetiska åtgärder, villkorsuttryck och andra aggregeringsoperatorer.

Exempel

Nu ska vi förstå användningen med exempel-json från stores datauppsättningen.

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

Exempel 1: Jämför heltids- och deltidsanställda

Exemplet hämtar butiker med antalet heltidsanställda större än deltidsanställda.

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

Frågan jämför två fält i samma dokument och returnerar dokumentet om villkoret uppfylls (antalet heltidsanställda överskrider antalet deltidsanställda).

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

Exempel 2: Villkorsstyrd logik med lagringsplats

Exemplet visar användningen av villkorsstyrd logik med $expr som hämtar butiker på södra halvklotet där personaleffektivitetskvoten (försäljning per anställd) överstiger 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)

Frågan kombinerar platsbaserad filtrering med ett beräknat effektivitetsmått som visar kraften $expr i för komplex affärslogik.

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