11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

今回は、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
というものがありますが、ネストしたリソースに関しては同じ問題が付いて回ります。

11
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?