Compartir a través de


$expr (consulta de evaluación)

SE APLICA A: núcleo virtual de MongoDB

El $expr operador permite el uso de expresiones de agregación dentro del lenguaje de consulta, lo que nos permite comparar campos del mismo documento, realizar cálculos y usar operadores de agregación en operaciones de búsqueda. El $expr operador es útil para comparaciones complejas de campos que no se pueden lograr con operadores de consulta tradicionales.

Sintaxis

La sintaxis del $objectToArray operador es la siguiente:

{
  $expr: { <aggregation expression> }
}

Parámetros

Descripción
<aggregation expression> Cualquier expresión de agregación válida que se evalúe como un valor booleano. La expresión incluye comparaciones de campos, operaciones aritméticas, expresiones condicionales y otros operadores de agregación.

Ejemplo

Vamos a comprender el uso con un JSON de ejemplo del conjunto de datos stores.

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

Ejemplo 1: Comparación del personal a tiempo completo y de tiempo parcial

En el ejemplo se recuperan almacenes con el número de empleados a tiempo completo mayores que los empleados de tiempo parcial.

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

La consulta compara dos campos dentro del mismo documento y devuelve el documento si se cumple la condición (el número de personal de tiempo completo supera el número de personal de tiempo parcial).

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

Ejemplo 2: Lógica condicional con ubicación de almacén

En el ejemplo se muestra el uso de lógica condicional con $expr tiendas de extracción en el hemisferio sur donde la relación de eficiencia del personal (ventas por empleado) supera el 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)

La consulta combina el filtrado basado en ubicación con una métrica de eficiencia calculada, que muestra la eficacia de $expr para una lógica empresarial compleja.

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