Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

式の属性名

式の属性名は、実際の属性名の代わりとして式で使用するプレースホルダーです。式の属性名は # で始まり、1 つ以上の英数字が続きます。

このセクションでは、式の属性名を使用する必要があるいくつかの状況について説明します。

注記

このセクションの例では AWS CLI を使用します。プログラミング言語別の例については、「DynamoDB の使用開始」を参照してください。

予約語

場合によっては、DynamoDB 予約語と競合する属性名を含む式を書く必要が生じることがあります。予約語の一覧については、「DynamoDB の予約語」を参照してください。

たとえば、COMMENT は予約語であるため、次の AWS CLI の例は失敗します。

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Comment"

この問題に対処するには、Comment を、#c などの式の属性名で置き換えることができます。#(シャープ記号)は必須であり、これが属性名のプレースホルダーであることを示します。AWS CLI の例は次のようになります。

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#c" \ --expression-attribute-names '{"#c":"Comment"}'

注記

属性名が数値で始まるか、スペース、特殊文字、または予約語を含む場合、式の属性名を使用して式のその属性名を置き換えなければなりません

ドットを含む属性名

式では、ドット (".") はドキュメントパスの区切り文字として解釈されます。ただし、DynamoDB では属性名の一部としてドット文字を使用することもできます。これは、あいまいな意味を持つことがあります。例として、ProductCatalog 項目から Safety.Warning 属性を取得するとします (項目属性の指定 を参照してください)。

プロジェクション式を使用して、Safety.Warning にアクセスするとします。

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Safety.Warning"

DynamoDB は、予想される文字列 ("Always wear a helmet") ではなく空の結果を返します。これは、DynamoDB が式のドットをドキュメントパスの区切り文字として解釈するためです。この場合、#sw の置換として式の属性名(Safety.Warning など)を定義する必要があります。その後、次のプロジェクション式を使用します。

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#sw" \ --expression-attribute-names '{"#sw":"Safety.Warning"}'

次に、DynamoDB が正しい結果を返します。

入れ子の属性

ここでは、次のプロジェクション式を使用して、入れ子の属性 ProductReviews.OneStar にアクセスするとします。

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.OneStar"

結果は、1 つ星の製品レビューすべてを含みます (正常です)。

ただし、代わりに式属性名を使用することにした場合はどうなるでしょうか。 たとえば、#pr1star の置換として ProductReviews.OneStar を定義した場合はどうなるでしょうか。

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr1star" \ --expression-attribute-names '{"#pr1star":"ProductReviews.OneStar"}'

DynamoDB は予想される 1 つ星の評価のマップの代わりに空の結果を返します。これは、DynamoDB が式属性値のドットを属性名内の文字として解釈するためです。DynamoDB は、式属性名 #pr1star を評価すると、ProductReviews.OneStar がスカラー属性を参照していると判断します。これは意図されたものではありません。

ドキュメントパス内の要素ごとに式の属性名を定義するのが正しい方法です。

  • #pr — ProductReviews

  • #1star — OneStar

その後、プロジェクション式として #pr.#1star を使用します。

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.#1star" \ --expression-attribute-names '{"#pr":"ProductReviews", "#1star":"OneStar"}'

次に、DynamoDB が正しい結果を返します。

属性名の繰り返し

式の属性名は、同じ属性名を繰り返し参照する必要がある場合に役立ちます。たとえば、ProductCatalog 項目からいくつかの評価を取得する次の式を考えてみます。

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.FiveStar, ProductReviews.ThreeStar, ProductReviews.OneStar"

これをより簡潔にするために、ProductReviews を、#pr などの式の属性名で置き換えることができます。変更された式は次のようになります。

  • #pr.FiveStar, #pr.ThreeStar, #pr.OneStar

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.FiveStar, #pr.ThreeStar, #pr.OneStar" \ --expression-attribute-names '{"#pr":"ProductReviews"}'

式属性名を定義した場合、式全体で一貫して使用する必要があります。さらに、# 記号を省略することはできません。