Delen via


$indexOfArray

De $indexOfArray operator wordt gebruikt om te zoeken naar een element in een matrix en de index van het eerste exemplaar van het element te retourneren. Als het element niet wordt gevonden, wordt het geretourneerd -1. Deze operator is handig voor query's waarbij u de positie van een element in een matrix moet bepalen. Zoek bijvoorbeeld de index van een specifieke waarde of een specifiek object in een lijst.

Syntaxis

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

Parameterwaarden

Kenmerk Description
<array> De matrix waarin u naar het element wilt zoeken.
<searchElement> Het element dat u zoekt in de matrix.
<start> (Optioneel) De index waaruit de zoekopdracht moet worden gestart. Als u dit weglaat, begint de zoekopdracht vanaf het begin van de matrix.
<end> (Optioneel) De index waarop de zoekopdracht moet worden beƫindigd. Als u dit weglaat, gaat de zoekopdracht tot het einde van de matrix.

Voorbeelden

Bekijk dit voorbeelddocument uit de winkelverzameling.

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

Voorbeeld 1: de index van het eerste exemplaar zoeken

Met deze query wordt de positie (index) van een specifieke categorienaam (DJ Headphones) gevonden in de salesByCategory matrix in de verzameling.

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

Deze query retourneert de volgende resultaten:

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

Voorbeeld 2: De index zoeken in een bereik

Deze query vindt de positie van de promotie-gebeurtenis 'Bargain Blitz Days' in de promotionEvents matrix binnen een specifiek bereik van indexen (3 tot 5) en filtert resultaten samen met het retourneren van de eerste drie overeenkomende documenten

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

Deze query retourneert de volgende resultaten:

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