Compartir a través de


$indexOfArray

El $indexOfArray operador se usa para buscar un elemento en una matriz y devolver el índice de la primera aparición del elemento. Si no se encuentra el elemento, devuelve -1. Este operador es útil para las consultas en las que es necesario determinar la posición de un elemento dentro de una matriz. Por ejemplo, buscar el índice de un valor o objeto específico en una lista.

Syntax

{
    $indexOfArray: [ < array > , < searchElement > , < start > , < end > ]
}

Parámetros

Parámetro Description
<array> Matriz en la que desea buscar el elemento .
<searchElement> Elemento que está buscando en la matriz.
<start> (Opcional) Índice desde el que se va a iniciar la búsqueda. Si se omite, la búsqueda comienza desde el principio de la matriz.
<end> (Opcional) Índice en el que se va a finalizar la búsqueda. Si se omite, la búsqueda va hasta el final de la matriz.

Examples

Considere este documento de ejemplo de la colección de tiendas.

{
    "_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: Buscar el índice de la primera aparición

Esta consulta busca la posición (índice) de un nombre de categoría específico ("Dj Headphones") dentro de la salesByCategory matriz en toda la colección.

db.stores.aggregate([
  {
    $project: {
      index: {
        $indexOfArray: [
          "$sales.salesByCategory.categoryName",
          "DJ Headphones"
        ]
      }
    }
  },
  // Limit the result to the first 3 documents
  { $limit: 3 } 
])

Esta consulta devuelve los siguientes resultados:

[
    {
        "_id": "649626c9-eda1-46c0-a27f-dcee19d97f41",
        "index": -1
    },
    {
        "_id": "8345de34-73ec-4a99-9cb6-a81f7b145c34",
        "index": -1
    },
    {
        "_id": "57cc4095-77d9-4345-af20-f8ead9ef0197",
        "index": -1
    }
]

Ejemplo 2: Búsqueda del índice en un intervalo

Esta consulta busca la posición del evento de promoción "Gang Blitz Days" dentro de la promotionEvents matriz dentro de un intervalo específico de índices (de 3 a 5) y filtra los resultados junto con la devolución de los tres primeros documentos coincidentes

db.stores.aggregate([
  // Step 1: Project the index of the "Bargain Blitz Days" event name within the specified range
  {
    $project: {
      index: {
        $indexOfArray: [
          "$promotionEvents.eventName",
          "Bargain Blitz Days",
          3,
          5
        ]
      }
    }
  },
  // Step 2: Match documents where index > 0
  {
    $match: {
      index: { $gt: 0 }
    }
  },
 // Limit the result to the first 3 documents
  { $limit: 3 }                          
])

Esta consulta devuelve los siguientes resultados:

 [
    {
        "_id": "ced8caf0-051a-48ce-88d3-2935815261c3",
        "index": 3
    },
    {
        "_id": "509be7ce-539a-41b5-8fde-b85fb3ef3faa",
        "index": 3
    },
    {
        "_id": "d06e8136-9a7f-4b08-92c8-dc8eac73bad3",
        "index": 3
    }
]