Partager via


$indexOfArray

L’opérateur $indexOfArray est utilisé pour rechercher un élément dans un tableau et retourner l’index de la première occurrence de l’élément. Si l’élément est introuvable, il retourne -1. Cet opérateur est utile pour les requêtes où vous devez déterminer la position d’un élément dans un tableau. Par exemple, recherchez l’index d’une valeur ou d’un objet spécifique dans une liste.

Syntaxe

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

Paramètres

Paramètre Descriptif
<array> Tableau dans lequel vous souhaitez rechercher l’élément.
<searchElement> Élément que vous recherchez dans le tableau.
<start> (Facultatif) Index à partir duquel démarrer la recherche. Si elle est omise, la recherche commence à partir du début du tableau.
<end> (Facultatif) Index auquel mettre fin à la recherche. En cas d’omission, la recherche est effectuée jusqu’à la fin du tableau.

Examples

Considérez cet exemple de document de la collection des magasins.

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

Exemple 1 : Recherche de l’index de la première occurrence

Cette requête recherche la position (index) d’un nom de catégorie spécifique (« DJ Headphones ») dans le tableau dans la salesByCategory collection.

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

Cette requête retourne les résultats suivants :

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

Exemple 2 : Recherche de l’index dans une plage

Cette requête recherche la position de l’événement de promotion « Bargain Blitz Days » dans le promotionEvents tableau dans une plage spécifique d’index (3 à 5) et filtre les résultats, ainsi que le renvoi des trois premiers documents correspondants

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 }                          
])

Cette requête retourne les résultats suivants :

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