Compartir a través de


$filter (expresión de matriz)

SE APLICA A: núcleo virtual de MongoDB

El $filter operador se usa para filtrar elementos de una matriz en función de una condición especificada. Este operador es útil cuando necesita manipular o recuperar elementos de matriz específicos dentro de documentos.

Sintaxis

La sintaxis básica del $filter operador es la siguiente:

{
  "$filter": {
    "input": "<array>",
    "as": "<string>",
    "cond": "<expression>"
  }
}

Parámetros

Descripción
input Expresión que se resuelve en una matriz.
as Cadena que especifica el nombre de variable para cada elemento de la matriz de entrada.
cond Expresión que determina si se debe incluir el elemento en la matriz de salida.

Ejemplo

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

{
  "_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 },
      { "categoryName": "DJ Cables", "totalSales": 1000 }
    ],
    "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 }
      ]
    },
    {
      "eventName": "Discount Delight Days",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 5, "Day": 11 },
        "endDate": { "Year": 2024, "Month": 5, "Day": 18 }
      }
    }
  ],
  "tag": [
    "#ShopLocal",
    "#FashionStore",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}

Ejemplo 1: Recuperar un elemento filtrado por condición

En el ejemplo siguiente se muestra cómo filtrar la categoría de ventas en función de totalSales.

db.yourCollection.aggregate([
  { $match: { _id: '7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5' } },
  { $project: { filteredSalesByCategory: { $filter: { input: "$sales.salesByCategory", as: "item", cond: { $gt: ["$$item.totalSales", 10000] } } } } }
])

El documento resultante tiene un campo adicional, , filteredSalesByCategoryque incluye los elementos de que tienen salesByCategory más de totalSales 10000.

{
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "filteredSalesByCategory": [ { "categoryName": "DJ Headphones", "totalSales": 35921 } ]
}