背景
DynamoDB でも 複合キーが使える
Partition & Sort Key って意味ではなく
それぞれの Key の値自体が複合キーという意味で。
[country]#[region]#[state]#[county]#[city]#[neighborhood]
てっきり、属性を定義してやれば、勝手に Partition/Sort Key に参照値が入るのかと思ったんですが・・以下しかないそうな
- 複合キーを # で分割して、元の値を取得
- 上記例で言えば、split(key value, "#") みたいにして、[country], [region] を取り出す
- 複合キーとは別に、元の値を保存
- 上記例で言えば、[country], [region] の属性を別に用意しておいて、利用する
でもって、PK/SK の命名もまた摩訶不思議
- 色々なデータを格納できるように、PK/SK とする
- 属性名を # 区切りで命名
- 例)userID#timestamp
で、今回の本題
TypeScript で、# を含んだ属性名をどうやって取得するのか?
普通の属性ならこんな感じ
const itemID = record.dynamodb.NewImage.UserID.S;
同様にして、以下のようにやろうとすると
const itemID = record.dynamodb.NewImage.userID#timestamp.S;
SyntaxError: Unexpected identifier
TypeScript/JavaScript に慣れた人にとっては簡単なんでしょうけれど、素人はここで嵌まりました
で、TypeScript の文法を調べて解決したのが、以下
const uidTime = record.dynamodb.NewImage["userID#timestamp"].S;
この後で、Splitする必要があるってのが面倒なんですが・・
複合キーの件を最終的に上記認識になった Q&A
AWS ドキュメントを色々探したり、実際に テーブル作成をしてみて、最終的に以下の回答を見て、認識とした。
When reading the records back, if you don't want to parse the combined field back out to its individual parts, then you'll have to add additional separate fields for InvoiceNumber and LineItemID.
あとがき
10年ほど前?は JavaScript はなんか読みにくくて嫌いな言語だったんですが、
TypeScript を触ってみると、あれ?こんなに書きやすいんだっけ?とビックリしてます。
VS Code のおかげなのか、チェーンが快適だからなのか、言語間で互いに良い点を取り入れていってくれてるおかげですかね?