AWS
DynamoDB

[AWS] DynamoDB でネストしたレコードの扱いかた。

More than 1 year has passed since last update.

今回は、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

というものがありますが、ネストしたリソースに関しては同じ問題が付いて回ります。