Compartir a través de


$cond (expresión condicional)

El $cond operador se usa para evaluar una condición y devolver una de estas dos expresiones en función del resultado. Es similar al operador ternario en muchos lenguajes de programación. El $cond operador se puede usar en canalizaciones de agregación para agregar lógica condicional a las consultas.

Sintaxis

La sintaxis básica del $cond operador es:

{
   $cond: {
      if: <boolean-expression>,
      then: <true-case>,
      else: <false-case>
   }
}

Parámetros

Descripción
si Expresión booleana que se evalúa.
then Expresión que se va a devolver si la if condición se evalúa como true.
De lo contrario: Expresión que se va a devolver si la if condición se evalúa como false.

Ejemplos

Vamos a comprender el uso con el siguiente json de ejemplo.

{
  "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
   "name": "Lakeshore Retail | DJ Equipment Stop - Port Cecile",
  "location": {
    "lat": 60.1441,
    "lon": -141.5012
  },
  "staff": {
    "totalStaff": {
      "fullTime": 2,
      "partTime": 0
    }
  },
  "sales": {
    "salesByCategory": [
      {
        "categoryName": "DJ Headphones",
        "totalSales": 35921
      }
    ],
    "fullSales": 3700
  },
  "promotionEvents": [
    {
      "eventName": "Bargain Blitz Days",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 3,
          "Day": 11
        },
        "endDate": {
          "Year": 2024,
          "Month": 2,
          "Day": 18
        }
      },
      "discounts": [
        {
          "categoryName": "DJ Turntables",
          "discountPercentage": 18
        },
        {
          "categoryName": "DJ Mixers",
          "discountPercentage": 15
        }
      ]
    }
  ],
  "tag": [
    "#ShopLocal",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}

Ejemplo 1: Determinar categorías de ventas elevadas

Para determinar si las ventas de cada categoría se consideran "altas" o "bajas" en función de un valor de umbral de 250 000 USD.

db.stores.aggregate([
  {
    $project: {
      _id: 0,
      storeId: "$storeId",
      category: "$sales.salesByCategory.categoryName",
      sales: "$sales.salesByCategory.totalSales",
      salesCategory: {
        $cond: {
          if: { $gte: ["$sales.salesByCategory.totalSales", 250000] },
          then: "High",
          else: "Low"
        }
      }
    }
  },
  // Limit the result to the first 3 documents
  { $limit: 3 }  
])

Esta consulta devolvería el siguiente documento.

[
  {
    "sales": [ 35921, 1000 ],
    "category": [ "DJ Headphones", "DJ Cables" ],
    "salesCategory": "High"
  },
  { "sales": [ 4760 ], "category": [ "Guitars" ], "salesCategory": "High" },
  {
    "sales": [
      14697, 44111,
      37854, 46211,
       7269, 25451,
      21083
    ],
    "category": [
      "Washcloths",
      "Innerspring Mattresses",
      "Microfiber Towels",
      "Shower Curtains",
      "Bathrobes",
      "Tablecloths",
      "Bath Accessories"
    ],
    "salesCategory": "High"
  }
]

Ejemplo 2: Determinar la dominación a tiempo completo o a tiempo parcial

Para determinar si una tienda emplea más personal a tiempo completo o a tiempo parcial.

db.stores.aggregate([
  {
    $project: {
      name: 1,
      staffType: {
        $cond: {
          if: { $gte: ["$staff.totalStaff.fullTime", "$staff.totalStaff.partTime"] },
          then: "More Full-Time",
          else: "More Part-Time"
        }
      }
    }
  },
  // Limit the result to the first 3 documents
  { $limit: 3 }  
])

Esta consulta devolvería el siguiente documento.

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "name": "Lakeshore Retail | DJ Equipment Stop - Port Cecile",
    "staffType": "More Full-Time"
  },
  {
    "_id": "649626c9-eda1-46c0-a27f-dcee19d97f41",
    "name": "VanArsdel, Ltd. | Musical Instrument Outlet - East Cassie",
    "staffType": "More Full-Time"
  },
  {
    "_id": "8345de34-73ec-4a99-9cb6-a81f7b145c34",
    "name": "Northwind Traders | Bed and Bath Place - West Oraland",
    "staffType": "More Part-Time"
  }
]