Aracılığıyla paylaş


Dizinin Indeksi ($indexOfArray)

$indexOfArray işleci, bir dizideki bir öğeyi aramak ve öğenin ilk oluşumunun dizinini döndürmek için kullanılır. öğesi bulunamazsa döndürür -1. Bu işleç, bir öğenin dizi içindeki konumunu belirlemeniz gereken sorgular için kullanışlıdır. Örneğin, listedeki belirli bir değerin veya nesnenin dizinini bulma.

Sözdizimi

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

Parametreler

Parametre Description
<array> öğesini aramak istediğiniz dizi.
<searchElement> Dizide aradığınız öğe.
<start> (İsteğe bağlı) Aramanın başlatıldığı dizin. Atlanırsa, arama dizinin başından başlar.
<end> (İsteğe bağlı) Aramanın sonlandırıldığı dizin. Atlanırsa, arama dizinin sonuna kadar gider.

Örnekler

Stores koleksiyonundaki bu örnek belgeyi göz önünde bulundurun.

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

Örnek 1: İlk oluşumun dizinini bulma

Bu sorgu, koleksiyon genelinde dizi içinde salesByCategory belirli bir kategori adının ("DJ Headphones") konumunu (dizinini) bulur.

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

Bu sorgu aşağıdaki sonuçları döndürür:

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

Örnek 2: Aralıktaki dizini bulma

Bu sorgu, dizinin içindeki "Bargain Blitz Days" yükseltme olayının konumunu belirli bir dizin aralığı içinde promotionEvents (3 ila 5) bulur ve sonuçları filtreler ve eşleşen ilk üç belgeyi döndürür

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

Bu sorgu aşağıdaki sonuçları döndürür:

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