

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Indeks sebagian
<a name="partial-index"></a>

Indeks sebagian mengindeks dokumen dalam koleksi yang memenuhi kriteria filter tertentu. Fitur indeks sebagian didukung di kluster berbasis instans Amazon DocumentDB 5.0.

**Topics**
+ [Buat indeks sebagian](#create-partial-index)
+ [Operator yang didukung](#partial-index-operators)
+ [Kueri menggunakan indeks paral](#partial-index-query)
+ [Fungsionalitas indeks sebagian](#partial-index-functionalities)
+ [Keterbatasan indeks sebagian](#partial-index-limitations)

## Buat indeks sebagian
<a name="create-partial-index"></a>

Untuk membuat indeks sebagian, gunakan `createIndex()` metode dengan `partialFilterExpression` opsi. Misalnya, operasi berikut membuat indeks gabungan unik dalam koleksi pesanan yang mengindeks dokumen yang memiliki `OrderID` dan memiliki `isDelivered` bidang sebagai true:

```
db.orders.createIndex(
  {"category": 1, "CustomerId": 1, "OrderId": 1}, 
  {"unique": true, "partialFilterExpression": 
    {"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}}
    ]}
  }
)
```

## Operator yang didukung
<a name="partial-index-operators"></a>


+ **\$1 eq**
+ **\$1 ada**
+ **\$1 dan** (hanya di tingkat atas)
+ **\$1gt/\$1gte/\$1lt/\$1lte** (pemindaian indeks hanya digunakan ketika filter, diprediksikan dalam kueri, cocok dengan ekspresi filter sebagian persis) (Lihat Batasan)

## Kueri menggunakan indeks paral
<a name="partial-index-query"></a>

Pola kueri berikut dimungkinkan menggunakan indeks sebagian:
+ Predikat kueri sama persis dengan ekspresi filter indeks sebagian:

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}}
    ]}).explain()
  ```
+ Hasil yang diharapkan filter kueri adalah subset logis dari filter paral:

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}},
      {"OrderAmount": {"$eq": "5"}}
    ]}).explain()
  ```
+ Sub-predikat kueri dapat digunakan bersama dengan indeks lain:

  ```
  db.orders.createIndex({"anotherIndex":1})
  db.orders.find({ "$or": [
        {"$and": [
          {"OrderId": {"$exists": true}}, 
          {"isDelivered": {"$eq": false}}
        ]},
        {"anotherIndex": {"$eq": 5}}
      ]
    }).explain()
  ```

**catatan**  
Perencana kueri dapat memilih untuk menggunakan pemindaian koleksi daripada pemindaian indeks jika efisien untuk melakukannya. Ini biasanya terlihat untuk koleksi atau kueri yang sangat kecil yang akan mengembalikan sebagian besar koleksi.

## Fungsionalitas indeks sebagian
<a name="partial-index-functionalities"></a>

**Daftar indeks sebagian**

Buat daftar indeks sebagian dengan partialFilterExpression menggunakan `getIndex` operasi. Misalnya, `getIndex` operasi yang dikeluarkan dalam mencantumkan indeks sebagian dengan bidang kunci, nama, dan partialFilterExpressions:

```
db.orders.getIndexes()
```

Contoh ini mengembalikan output sebagai berikut:

```
[
  {
    "v" : 4,
    "key" : {
      "_id" : 1
    },
    "name" : "_id_",
    "ns" : "ecommerceApp.orders"
  },
  {
    "v" : 4,
    "unique" : true,
    "key" : {
      "category" : 1,
      "" : 1,
      "CustomerId" : 1,
      "OrderId" : 1
    },
    "name" : "category_1_CustID_1_OrderId_1",
    "ns" : "ecommerceApp.orders",
    "partialFilterExpression" : {
      "$and" : [
        {"OrderId": {"$exists": true}}, 
        {"isDelivered": {"$eq": false}}
      ]
    }
  }
]
```

**Beberapa ekspresi filter paral pada kunci yang sama: urutan**

Indeks paral yang berbeda dapat dibuat untuk kombinasi bidang yang sama (key:order). Indeks ini harus memiliki nama yang berbeda.

```
db.orders.createIndex(
  {"OrderId":1},
  {
    name:"firstPartialIndex",
    partialFilterExpression:{"OrderId":{"$exists": true}}
  }
)
```

```
db.orders.createIndex(
  {"OrderId":1},
  {
    name:"secondPartialIndex",
    partialFilterExpression:{"OrderId":{"$gt": 1000}}
  }
)
```

Jalankan `getIndexes` operasi untuk mencantumkan semua indeks dalam koleksi:

```
db.orders.getIndexes()
```

Contoh-contoh ini mengembalikan output berikut:

```
[
  {
    "v" : 4,
    "key" : {
      "_id" : 1
    },
    "name" : "_id_",
    "ns" : "ecommerceApp.orders"
  },
  {
    "v" : 4,
    "key" : {
      "OrderId" : 1
    },
    "name" : "firstPartialIndex",
    "ns" : "ecommerceApp.orders",
    "partialFilterExpression" : {"OrderId":{"$exists": true}}
  },
  {
    "v" : 4,
    "key" : {
      "OrderId" : 1
    },
    "name" : "secondPartialIndex",
    "ns" : "ecommerceApp.orders",
    "partialFilterExpression" : {"OrderId":{"$gt": 1000}}
  }
]
```

**penting**  
Nama indeks harus berbeda dan harus dihapus dengan nama saja.

**Indeks dengan properti parsi dan TTL**

Anda juga dapat membuat indeks yang memiliki properti parsi dan TTL dengan menentukan keduanya `partialFilterExpression` dan `expireAfterSeconds` opsi selama pembuatan indeks. Ini memungkinkan Anda untuk memberikan kontrol lebih besar atas dokumen mana yang sekarang dihapus dari koleksi.

Misalnya, Anda mungkin memiliki indeks TTL yang mengidentifikasi dokumen yang akan dihapus setelah jangka waktu tertentu. Anda sekarang dapat memberikan ketentuan tambahan tentang kapan harus menghapus dokumen menggunakan opsi indeks sebagian:

```
db.orders.createIndex(
    { "OrderTimestamp": 1 },
    {
        expireAfterSeconds: 3600 , 
        partialFilterExpression: { "isDelivered": { $eq: true } } 
    }
)
```

Contoh ini mengembalikan output sebagai berikut:

```
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1234567890, 1)
}
```

Jalankan `getIndexes` operasi untuk mencantumkan indeks yang ada dalam koleksi:

```
db.orders.getIndexes()
[
    {
        "v" : 4,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.orders"
    }
```

Contoh ini mengembalikan output sebagai berikut:

```
[
    {
        "v": 4,
        "key": {
            "_id": 1
        },
        "name": "_id_",
        "ns": "ecommerceApp.orders"
    },
    {
        "v": 4,
        "key": {
            "OrderTimestamp": 1
        },
        "name": "OrderTimestamp_1",
        "ns": "ecommerceApp.orders",
        "partialFilterExpression": {
            "isDelivered": {
                "$eq": true
            }
        },
        "expireAfterSeconds": 3600
    }
]
```

## Keterbatasan indeks sebagian
<a name="partial-index-limitations"></a>

Batasan berikut berlaku untuk fitur indeks sebagian:
+ Kueri ketidaksetaraan di Amazon DocumentDB hanya akan menggunakan indeks sebagian ketika predikat filter kueri sama persis dengan dan memiliki tipe data `partialFilterExpression` yang sama.
**catatan**  
Bahkan `$hint` tidak dapat digunakan untuk memaksa IXSCAN untuk kasus di atas.

  Dalam contoh berikut, hanya `partialFilterExpression` diterapkan pada `field1` tetapi tidak`field2`:

  ```
  db.orders.createIndex(
    {"OrderAmount": 1}, 
    {"partialFilterExpression": { OrderAmount : {"$gt" : 5}}}
  )
  
  db.orders.find({OrderAmount : {"$gt" : 5}}) // Will use partial index
  db.orders.find({OrderAmount : {"$gt" : 6}}) // Will not use partial index
  db.orders.find({OrderAmount : {"$gt" : Decimal128(5.00)}}) // Will not use partial index
  ```
+ A `partialFilterExpression` dengan operator array tidak didukung. Operasi berikut akan menghasilkan kesalahan:

  ```
  db.orders.createIndex(
    {"CustomerId":1},
    {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}}
  )
  ```
+ Operator berikut tidak didukung di partialFilterExpression lapangan:
  + `$all`(operator array)
  + `$mod`(operator array)
  + `$or`
  + `$xor`
  + `$not`
  + `$nor`
+ Tipe data dari ekspresi filter dan filter harus sama.