Aracılığıyla paylaş


$expr (değerlendirme sorgusu)

aşağıdakiler için geçerlidir: MongoDB sanal çekirdeği

$expr işleci, aynı belgedeki alanları karşılaştırmamıza, hesaplamalar yapmamıza ve toplama işleçlerini bulma işlemlerinde kullanmamıza olanak tanıyan sorgu dili içinde toplama ifadelerinin kullanılmasına olanak tanır. işleci $expr , geleneksel sorgu işleçleriyle elde edilemedi karmaşık alan karşılaştırmaları için kullanışlıdır.

Sözdizimi

İşlecin $expr söz dizimi aşağıdaki gibidir:

{
  $expr: { <aggregation expression> }
}

Parametreler

Açıklama
<aggregation expression> Boole değeri olarak değerlendirilen geçerli toplama ifadeleri. İfade alan karşılaştırmalarını, aritmetik işlemleri, koşullu ifadeleri ve diğer toplama işleçlerini içerir.

Örnek

Şimdi veri kümesinden stores alınan örnek json ile kullanımı anlayalım.

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

Örnek 1: Tam zamanlı ve yarı zamanlı personeli karşılaştırma

Örnek, tam zamanlı çalışan sayısının yarı zamanlı çalışanlardan daha fazla olduğu mağazaları alır.

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

Sorgu, aynı belgedeki iki alanı karşılaştırır ve koşul karşılanırsa belgeyi döndürür (tam zamanlı personel sayısı yarı zamanlı personel sayısını aşıyor).

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

Örnek 2: Depolama konumuna sahip koşullu mantık

Örnekte, güney yarım kürede personel verimliliği oranının (çalışan başına satış) 2000'i aştığı $expr çekme mağazalarıyla koşullu mantık kullanımı gösterilmektedir.

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)

Sorgu, konum tabanlı filtrelemeyi hesaplanan verimlilik ölçümüyle birleştirerek karmaşık iş mantığının $expr gücünü gösterir.

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