はじめに
とある案件対応中、DynamoDB上でネストしている属性 1属性にJSON押し込んでるやつに対して検索、特定階層の値の一覧取得をしたいという場面に遭遇しました。
RDBでのイメージからこのような状況下ではLIKE検索(contains句)でひっかけた後頑張って整形する...といったアプローチしか取れないイメージが強かったのですが、PartiQLというものがあると知り、少し利用してみた際のメモとなります。
今回はマネジメントコンソール上から以下のPartiQLエディタを利用してみました
テスト用データ作成
お試しでシンプルな「test」テーブルを作成した後、以下のSQL文をPartiQLエディタから実行することでデータ投入を実施してみました。この時点でSQLのように操作できるという点がまずオドロキでした😲
INSERT INTO test VALUE {
'ID': 1,
'created_at': 12345,
'name': 'Taro Test',
'contact': {'email': 'test@example.com', 'phone': '090-1234-5678'},
'projects': [
{'project_id': 'P100', 'title': 'Data Migration', 'technologies': ['SQL', 'AWS', 'Lambda'], 'status': 'active'},
{'project_id': 'P101', 'title': 'Web Application Development', 'technologies': ['Ruby', 'Rails', 'PostgreSQL'], 'status': 'completed'}
],
'skills': ['SQL', 'Ruby', 'JavaScript', 'AWS']
}
検索を少し試してみた
簡単な例でネストしている属性に対していくつか検索を試してみました
# 属性名.キー名 の形でマップをハッシュのように掘れる!
select * from test where contact.email = 'test@example.com'
# 属性名[インデックス] の形でリストを配列のように掘れる!
select * from test where skills[0] = 'SQL'
# 組み合わせも行ける!
select * from test where projects[0].technologies[1] = 'AWS'
# 選択項目リストにも書ける!
select ID, contact.email from test
個人的に最後の性質が特に便利かつ今回欲しかったモノであり、
PartiQLエディタに備わっているSQLの実行結果をCSVとして保存する機能と組み合わせて、たどり着くまでに何階層も掘る必要がある深い階層の値をお手軽にCSV化出来たりします
おわりに
今回PartiQLというものにふとしたキッカケから触れてみましたが、個人的にとても魅力的な存在だと感じましたので今後仲良くなっていきたいです🙏
また、アプリケーション側でパースをしてからデータ利用等をしている状況で、DynamoDB上にはネスト構造を持っておらず全体が1つの長い文字列として保存されているパターンでは今回のようにサクサク掘っていくことは出来ず、基本的にcontains句等を中心にしたアプローチで取り組むしかないようです...😢
参考にさせていただいた記事
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ql-reference.html
https://qiita.com/danishi/items/a8f2da32232fd0abd922