DynamoDB Mapper でセカンダリインデックスを使用する - AWS SDK for Kotlin

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

DynamoDB Mapper でセカンダリインデックスを使用する

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

セカンダリインデックスのスキーマを定義する

DynamoDB テーブルは、ベーステーブル自体で定義されているキーとは異なるキーを使用してデータへのアクセスを提供するセカンダリインデックスをサポートします。ベーステーブルと同様に、DynamoDB Mapper は ItemSchemaタイプを使用してインデックスとやり取りします。

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 インスタンスを使用できるようになりました。

オペレーションでセカンダリインデックスを使用する

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