DynamoDBでソートキーを持つGSIに対してソートキーを指定しないクエリができるのか確認してみた
こんにちは、CX事業本部の若槻です。
今回は、DynamoDBでソートキーを持つGSI(グローバルセカンダリインデックス)に対してソートキーを指定しないクエリができるのか気になったので実際に確認してみました。
確認してみた
次のようなDynamoDBテーブルを使用して確認します。
$ aws dynamodb describe-table --table-name object { "Table": { "AttributeDefinitions": [ { "AttributeName": "createdAt", "AttributeType": "N" }, { "AttributeName": "objectId", "AttributeType": "S" }, { "AttributeName": "objectType", "AttributeType": "S" } ], "TableName": "object", "KeySchema": [ { "AttributeName": "objectId", "KeyType": "HASH" } ], "TableStatus": "ACTIVE", "CreationDateTime": 1594746956.736, "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 }, "TableSizeBytes": 0, "ItemCount": 0, "TableArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/object", "TableId": "262fab9b-b5d7-490a-b9a1-74f92a2272d3", "GlobalSecondaryIndexes": [ { "IndexName": "objectType-createdAt-index", "KeySchema": [ { "AttributeName": "objectType", "KeyType": "HASH" }, { "AttributeName": "createdAt", "KeyType": "RANGE" } ], "Projection": { "ProjectionType": "ALL" }, "IndexStatus": "ACTIVE", "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 }, "IndexSizeBytes": 0, "ItemCount": 0, "IndexArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/object/index/objectType-createdAt-index" } ] } }
テーブルには以下のようにアイテムを登録しました。
マネジメントコンソールより、GSIのインデックスに対してパーティションキーobjectType
を指定し、ソートキーcreatedAt
を指定しないでクエリをしたところ、アイテムを取得することができました。
AWS CLIの場合も同様にアイテムを取得することができました。
$ aws dynamodb query --table-name object \ --index-name objectType-createdAt-index \ --key-condition-expression "objectType = :type" \ --expression-attribute-values '{":type":{"S":"group"}}' { "Items": [ { "objectType": { "S": "group" }, "createdAt": { "N": "11111111" }, "objectId": { "S": "g0001" } } ], "Count": 1, "ScannedCount": 1, "ConsumedCapacity": null }
おわりに
DynamoDBでソートキーを持つGSIに対してソートキーを指定しないクエリでも、パーティションキーの指定が一致していればアイテムを取得できることが分かりました。
一つのGSIでクエリにパーティションキーのみ使うのかあるいはソートキーも使うのか、ユースケースに応じて変えられるのは便利ですね。
参考
以上