こんにちは、SCSK浦野です。
全く記事を書いていなかったのですが、DynamoDBをLambdaからクエリしようとした際に、何となくできそうだけど実装方法が分からず解決まで少し時間がかかってしまいましたので、今後同じことに困った際に思い出せるように記事にしておこうと思います。
やりたいこと
タイトルに記載した通り、Lambda (python3.9) からDynamoDBにクエリを実行した際のフィルタとして「~を含まない」を実装する事です。マネジメントコンソール上からは、画像の通り簡単に実行できます。
参照ドキュメント
公式ドキュメント
コードと実行結果
Lamnda(Python 3.9)においては、以下のようなコードで実現できます。
コード
サンプルの為、エラー処理等省いております。
import json import boto3 from boto3.dynamodb.conditions import Key def lambda_handler(event, context): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('techharmony') keyword = "AB" res = table.query( KeyConditionExpression = Key('pkey').eq('pkey1'), ExpressionAttributeNames = { "#Attr":"myAttr" }, ExpressionAttributeValues = { ":value" : keyword }, FilterExpression= 'NOT contains( #Attr, :value )' ) return(res)
テスト用のテーブルで実行した結果
テスト用のテーブルは以下のような感じでつくってあります。
pkey | skey | myAttr |
pkey1 | skey1 | ABC |
pkey1 | skey2 | DEF |
pkey2 | skey3 | GHI |
queryの結果として以下の内容が取得できます。
期待した通り、pkeyがpkey1でmyAttrに”AB”が含まれていない内容が取得できました。
{ "Items": [ { "myAttr": "DEF", "pkey": "pkey1", "skey": "skey2" } ], "Count": 1, ・・・以下略
以上となります。