Bagikan melalui


$indexOfArray (fungsi untuk mencari indeks dalam array)

Operator $indexOfArray digunakan untuk mencari elemen dalam array dan mengembalikan indeks kemunculan pertama elemen. Jika elemen tidak ditemukan, elemen akan mengembalikan -1. Operator ini berguna untuk kueri di mana Anda perlu menentukan posisi elemen dalam array. Misalnya, menemukan indeks nilai atau objek tertentu dalam daftar.

Syntax

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

Parameter-parameternya

Pengaturan Description
<array> Array tempat Anda ingin mencari elemen .
<searchElement> Elemen yang Anda cari dalam array.
<start> (Opsional) Indeks tempat memulai pencarian. Jika dihilangkan, pencarian dimulai dari awal array.
<end> (Opsional) Indeks untuk mengakhiri pencarian. Jika dihilangkan, pencarian akan berlangsung hingga akhir array.

Examples

Pertimbangkan dokumen sampel ini dari koleksi toko.

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

Contoh 1: Menemukan indeks kemunculan pertama

Kueri ini menemukan posisi (indeks) dari nama kategori tertentu ("Headphone DJ") di dalam salesByCategory array di seluruh koleksi.

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

Kueri ini mengembalikan hasil berikut:

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

Contoh 2: Menemukan indeks dalam rentang

Kueri ini menemukan posisi peristiwa promosi "Bargain Blitz Days" di dalam promotionEvents array dalam rentang indeks tertentu (3 hingga 5) dan memfilter hasil bersama dengan mengembalikan tiga dokumen pertama yang cocok

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

Kueri ini mengembalikan hasil berikut:

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