前回はテーブルから単一項目を取得しました。
今回はグローバルセカンダリインデックスを作成します。
グローバルセカンダリインデックスについては以下を参照して下さい。
ベーステーブルの作成
説明
グローバルセカンダリインデックスはベーステーブルから作成されるので、まずはベーステーブルを作成します。
なお、ベーステーブルの作成と同時にグローバルセカンダリインデックスを作成できますが、今回はベーステーブルを作成した後にグローバルセカンダリインデックスを作成します。
テーブルの作成の説明については以下を参考にして下さい。
テーブル作成プログラム
const DynamoDbSetter = require("./DynamoDbSetter");
module.exports = class DynamoDbOperator extends DynamoDbSetter{
async exec(event) {
// 実行内容
let params = {
TableName : "Musics",
KeySchema: [
{ AttributeName: "title", KeyType: "HASH" }, //Partition key
{ AttributeName: "artist", KeyType: "RANGE"} //Sort key
],
AttributeDefinitions: [
{ AttributeName: "title", AttributeType: "S" },
{ AttributeName: "artist", AttributeType: "S" }
],
ProvisionedThroughput: {
ReadCapacityUnits: 10,
WriteCapacityUnits: 10
}
};
// 実行
return await this.dynamodb.createTable(params).promise();
}
}
グローバルセカンダリインデックスの作成
実行
“genre” 属性についてグローバルセカンダリインデックスを作成します。
テーブル作成の時は、createTable を実行することになりますが、今回はベーステーブルに対しての変更になるので、updateTable を実行することになります。
const DynamoDbSetter = require("./DynamoDbSetter");
module.exports = class DynamoDbOperator extends DynamoDbSetter{
async exec(event) {
// 実行内容
let params = {
TableName : "Musics",
AttributeDefinitions: [
{ AttributeName: "genre", AttributeType: "S" }
],
GlobalSecondaryIndexUpdates: [
{
Create: {
IndexName: "genreIndex",
KeySchema: [
{ AttributeName: "genre", KeyType: "HASH"}, //Partition key
],
Projection: {
ProjectionType: "INCLUDE",
NonKeyAttributes: ["year"]
},
ProvisionedThroughput: {
ReadCapacityUnits: 10,
WriteCapacityUnits: 10
}
}
},
],
};
// 実行
return await this.dynamodb.updateTable(params).promise();
}
}
実行内容の説明
AttributeDefinitions
グローバルセカンダリインデックスのプライマリキーのデータタイプを定義します。
KeySchema
グローバルセカンダリインデックスのパーティションキーを定義します。オプションでソートキーを定義します。
Projection
射影する属性を指定します。
Projection の ProjectionType の指定はいくつか種類があります。今回は “INCLUDE” を指定しました。
こうすると、プライマリキー以外の属性が射影できます。今回は属性名 “year” を射影します。
なお、ベーステーブルのプライマリキー属性は自動的にグローバルセカンダリインデックスへ射影されます。
Projection、射影については以下を参照して下さい。
ProvisionedThroughput
ベーステーブルのスループットとは別になりグローバルセカンダリインデックス毎に独立しています。
結果
{
"TableDescription": {
"AttributeDefinitions": [
{
"AttributeName": "artist",
"AttributeType": "S"
},
{
"AttributeName": "genre",
"AttributeType": "S"
},
{
"AttributeName": "title",
"AttributeType": "S"
}
],
"TableName": "Musics",
"KeySchema": [
{
"AttributeName": "artist",
"KeyType": "HASH"
},
{
"AttributeName": "title",
"KeyType": "RANGE"
}
],
"TableStatus": "UPDATING",
"CreationDateTime": "2021-08-27T08:07:00.984Z",
"ProvisionedThroughput": {
"LastDecreaseDateTime": "2021-08-27T08:19:04.873Z",
"NumberOfDecreasesToday": 1,
"ReadCapacityUnits": 5,
"WriteCapacityUnits": 5
},
"TableSizeBytes": 0,
"ItemCount": 0,
"TableArn": "arn:aws:dynamodb:ap-northeast-1:081461195071:table/Musics",
"TableId": "43b2bf37-3a41-473d-8c60-b553a1e6334f",
"GlobalSecondaryIndexes": [
{
"IndexName": "genreIndex",
"KeySchema": [
{
"AttributeName": "genre",
"KeyType": "HASH"
}
],
"Projection": {
"ProjectionType": "INCLUDE",
"NonKeyAttributes": [
"year"
]
},
"IndexStatus": "CREATING",
"Backfilling": false,
"ProvisionedThroughput": {
"NumberOfDecreasesToday": 0,
"ReadCapacityUnits": 10,
"WriteCapacityUnits": 10
},
"IndexSizeBytes": 0,
"ItemCount": 0,
"IndexArn": "arn:aws:dynamodb:ap-northeast-1:081461195071:table/Musics/index/genreIndex"
}
]
}
}
最後に
次回は複数の項目を取得します。