Condividi tramite


$indexOfArray (operatore di espressione di matrice)

SI APPLICA A: MongoDB vCore

L'operatore $indexOfArray viene usato per cercare un elemento in una matrice e restituire l'indice della prima occorrenza dell'elemento. Se l'elemento non viene trovato, restituisce -1. Questo operatore è utile per le query in cui è necessario determinare la posizione di un elemento all'interno di una matrice. Ad esempio, trovare l'indice di un valore o un oggetto specifico in un elenco.

Sintassi

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

Parametri

Descrizione
<array> Matrice in cui si desidera cercare l'elemento .
<searchElement> Elemento che si sta cercando nella matrice.
<start> (Facoltativo) Indice da cui avviare la ricerca. Se omesso, la ricerca inizia dall'inizio della matrice.
<end> (Facoltativo) Indice in corrispondenza del quale terminare la ricerca. Se omesso, la ricerca viene eseguita fino alla fine della matrice.

Esempi

Si esaminerà ora l'utilizzo con il codice JSON di esempio seguente.

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

Esempio 1: Ricerca dell'indice della prima occorrenza

Per trovare l'indice della categoria "Cuffie DJ" nella salesByCategory matrice in tutti i documenti:

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

Questa query restituirà il documento seguente.

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

Esempio 2: Ricerca dell'indice in un intervallo

Per trovare documenti con indice compreso tra 3 e 5 per l'evento "Bargain Blitz Days" nella promotionEvents matrice:

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

Questa query restituirà il documento seguente.

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