

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

# DynamoDB Mapper でセカンダリインデックスを使用する
<a name="ddb-mapper-secondary-indices"></a>

****  
**DynamoDB Mapper はデベロッパープレビューリリースです。機能は完了しておらず、変更される可能性があります。**

## セカンダリインデックスのスキーマを定義する
<a name="ddb-mapper-secondary-indices-schema"></a>

DynamoDB テーブルは、ベーステーブル自体で定義されているキーとは異なるキーを使用してデータへのアクセスを提供するセカンダリインデックスをサポートします。ベーステーブルと同様に、DynamoDB Mapper は `[ItemSchema](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/dynamodb-mapper/aws.sdk.kotlin.hll.dynamodbmapper.items/-item-schema/index.html)`タイプを使用してインデックスとやり取りします。

DynamoDB セカンダリインデックスには、ベーステーブルのすべての属性を含める必要はありません。したがって、インデックスにマッピングされる Kotlin クラスは、そのインデックスのベーステーブルにマッピングされる Kotlin クラスとは異なる場合があります。この場合、インデックスクラスに対して別のスキーマを宣言する必要があります。

次のコードは、DynamoDB `cars`テーブルのインデックススキーマを手動で作成します。

```
import aws.sdk.kotlin.hll.dynamodbmapper.items.ItemConverter
import aws.sdk.kotlin.hll.dynamodbmapper.items.ItemSchema
import aws.sdk.kotlin.hll.dynamodbmapper.model.itemOf

// This is a data class for modelling the index of the Car table. Note
// that it contains a subset of the fields from the Car class and also 
// uses different names for them.
data class Model(val name: String, val manufacturer: String)

// We define an item converter.
val modelConverter = object : ItemConverter<Model> {
    override fun convertTo(from: Model, onlyAttributes: Set<String>?): Item  = itemOf(
        "model" to AttributeValue.S(from.name),
        "make" to AttributeValue.S(from.manufacturer),
    )

    override fun convertFrom(to: Item): Model = Model(
        name = to["model"]?.asSOrNull() ?: error("Invalid attribute `model`"),
        manufacturer = to["make"]?.asSOrNull() ?: error("Invalid attribute `make`"),
    )
}
val modelKey = KeySpec.String("model")
val makeKey = KeySpec.String("make")

val modelSchema = ItemSchema(modelConverter, modelKey, makeKey) // The partition key specification is the second parameter.

/* Note that `Model` index's partition key is `model` and its sort key is `make`,
   whereas the `Car` base table uses `make` as the partition key and `model` as the sort key:

        @DynamoDbItem
        data class Car(
            @DynamoDbPartitionKey
            val make: String,
    
            @DynamoDbSortKey
            val model: String,
    
            val initialYear: Int
        )
*/
```

オペレーションで`Model`インスタンスを使用できるようになりました。

## オペレーションでセカンダリインデックスを使用する
<a name="ddb-mapper-gs-index-ops"></a>

DynamoDB Mapper は、インデックスに対するオペレーションのサブセット、つまり `queryPaginated`と をサポートしています`scanPaginated`。インデックスでこれらのオペレーションを呼び出すには、まずテーブルオブジェクトからインデックスへの参照を取得する必要があります。次のサンプルでは、`cars-by-model`インデックス用に前に`modelSchema`作成した を使用します (ここでは作成は表示されません）。

```
val table = mapper.getTable("cars", CarSchema)
val index = table.getIndex("cars-by-model", modelSchema)

val modelFlow = index
    .scanPaginated { }
    .items()

modelFlow.collect { model -> println(model) }
```