今回は、DynamoDBのリスト型、マップ型を使う際にこうしたほうがいいんじゃないか? というお話です。
Webでも情報が少ないので、書くことにしました。
使用するのは、
AWS-SDK for javascript です。
結論
ネストは1階層まで。
子要素はすべて、stringifyしたJSONにする。
例
{
element: { S: 'element'},
children: { L: [
'{"c1e1": 'c1e1', "c1e2": "c1e2"}', <-- JSON.stringifyしたオブジェクト。
'{"c2e2": 'c2e2', "c2e2": "c2e2"}'
] }
}
理由
ネストしたDynamoDBオブジェクトは、getするとこうなる。(scan, queryでも同じ)
ネストしたリソースをレコードに入れると、以下のようになります。
DynamoDB の式にしたがうなら、
UpdateExpression のlist_appendなど を使うことになるでしょう。
dynamoDBに、以下のオブジェクトをPutしたとします。
{
element: { S: 'element'},
children: { L: [
{M:{c1e1: {S: 'c1e1'}, c1e2: {S: 'c1e2'}}},
{M:{c2e2: {S: 'c2e2'}, c2e2: {S: 'c2e2'}}}
] }
}
レコードは以下のようになります。
element -> 'element'
children -> { L: [{M:{c1e1: {S: 'c1e1'}, c1e2: {S: 'c1e2'}}}, {M:{c2e2: {S: 'c2e2'}, c2e2: {S: 'c2e2'}}}] }
これをgetで取り出すと以下のように取れます。
{
element: { S: 'element'},
children: { L: [
'Object'
'Object'
] }
}
Objectとして出力されてしまうので、アクセスできません。これを回避するために、ネストしている子オブジェクトはstringifyしましょう。
補足
DynamoDBを操作する際には、どうしても型情報が付いて回ります。つねに、
{S: 'XXXX'} や、{N: 123}
などと型を指定しなければならず、記載が煩雑になりがちです。
この型指定をうまいことラップしてくれている
DocumentClient
というものがありますが、ネストしたリソースに関しては同じ問題が付いて回ります。