

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 部分インデックス
<a name="partial-index"></a>

部分インデックスは、特定のフィルター基準を満たすコレクション内のドキュメントをインデックス化します。部分インデックス機能は、Amazon DocumentDB 5.0 インスタンスベースのクラスターでサポートされています。

**Topics**
+ [部分インデックスを作成する](#create-partial-index)
+ [サポートされている演算子](#partial-index-operators)
+ [部分インデックスを使用したクエリ](#partial-index-query)
+ [部分インデックス機能](#partial-index-functionalities)
+ [部分インデックスに関する制限事項](#partial-index-limitations)

## 部分インデックスを作成する
<a name="create-partial-index"></a>

部分インデックスを作成するには、`partialFilterExpression` オプションで `createIndex()` メソッドを使用します。例えば、次のオペレーションでは、`OrderID` を持ち、かつ `isDelivered` フィールドが true であるドキュメントをインデックス化する一意の複合インデックスを注文コレクションに作成します。

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

## サポートされている演算子
<a name="partial-index-operators"></a>


+ **\$1eq**
+ **.exists**()
+ **\$1and** (最上位のみ)
+ **\$1gt/\$1gte/\$1lt/\$1lte** (インデックススキャンは、クエリに述されているフィルターが部分フィルター式と完全に一致する場合にのみ使用されます) (制限事項を参照)

## 部分インデックスを使用したクエリ
<a name="partial-index-query"></a>

部分インデックスの使用により、次のクエリパターンを使用できます。
+ クエリ述語は、部分インデックスフィルター式と完全に一致します。

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}}
    ]}).explain()
  ```
+ クエリフィルターの想定される結果は、部分フィルターの論理サブセットです。

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}},
      {"OrderAmount": {"$eq": "5"}}
    ]}).explain()
  ```
+ クエリのサブ述語は、他のインデックスと組み合わせて使用できます。

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

**注記**  
クエリプランナーは、効率的に望ましい場合には、インデックススキャンではなくコレクションスキャンを使用することがあります。これは通常、コレクションの大部分を返す、非常に小さなコレクションまたはクエリに使用されます。

## 部分インデックス機能
<a name="partial-index-functionalities"></a>

**部分インデックスを一覧表示する**

`getIndex` オペレーションを使用して、partialFilterExpression を含む部分インデックスを一覧表示します。例えば、`getIndex` オペレーションは、キー、名前、および partialfilterExpressions フィールドを含む部分インデックスを一覧表示します。

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

この例は、以下のサンプル出力を返します。

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

**同じキー: 順序の複数の部分フィルター式**

同じフィールドの組み合わせ (キー:順序) に対して異なる部分インデックスを作成できます。これらのインデックスには別の名前が必要です。

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

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

`getIndexes` オペレーションを実行して、コレクション内のすべてのインデックスを一覧表示します。

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

コマンドは、次の出力例を返します。

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

**重要**  
インデックス名は異なる必要があり、名前のみで削除する必要があります。

**部分プロパティと TTL プロパティを持つインデックス**

インデックスの作成時に `partialFilterExpression` と `expireAfterSeconds` の両方のオプションを指定することで、部分プロパティと TTL プロパティを持つインデックスを作成することもできます。これにより、コレクションからどのようなドキュメントを除外するのかをよりきめ細かにコントロールできます。

例えば、特定の期間後に削除するドキュメントを特定する TTL インデックスがあるとします。ここで部分インデックスオプションを使用することで、ドキュメントを削除するタイミングに関する追加の条件を指定することができます。

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

この例は、以下のサンプル出力を返します。

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

`getIndexes` オペレーションを実行して、コレクションに存在するインデックスを一覧表示します。

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

この例は、以下のサンプル出力を返します。

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

## 部分インデックスに関する制限事項
<a name="partial-index-limitations"></a>

部分インデックス機能には、次の制限事項が適用されます。
+ Amazon DocumentDB の不等式クエリは、クエリフィルター述語が `partialFilterExpression` と完全に一致し、かつ同じデータ型である場合にのみ、部分インデックスを使用します。
**注記**  
上記のケースでは、`$hint` は IXSCAN の執行にも使用できません。

  次の例では、`partialFilterExpression` は `field1` にのみ適用され、`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
  ```
+ 配列演算子を持つ `partialFilterExpression` はサポートされていません。次の演算はエラーを生じます。

  ```
  db.orders.createIndex(
    {"CustomerId":1},
    {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}}
  )
  ```
+ partialFilterExpression フィールドでは、次の演算子はサポートされていません。
  + `$all` (配列演算子)
  + `$mod` (配列演算子)
  + `$or`
  + `$xor`
  + `$not`
  + `$nor`
+ フィルター式とフィルターのデータ型は同じである必要があります。