DynamoDBでソートキーを持つGSIに対してソートキーを指定しないクエリができるのか確認してみた

2020.07.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、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"
            }
        ]
    }
}

テーブルには以下のようにアイテムを登録しました。 image.png

マネジメントコンソールより、GSIのインデックスに対してパーティションキーobjectTypeを指定し、ソートキーcreatedAtを指定しないでクエリをしたところ、アイテムを取得することができました。 スクリーンショット 2020-07-15 2.19.06.png

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でクエリにパーティションキーのみ使うのかあるいはソートキーも使うのか、ユースケースに応じて変えられるのは便利ですね。

参考

以上