Lambda(Python3.9) で DynamoDBのクエリ時にフィルタで「~を含まない」を実装する

こんにちは、SCSK浦野です。

全く記事を書いていなかったのですが、DynamoDBをLambdaからクエリしようとした際に、何となくできそうだけど実装方法が分からず解決まで少し時間がかかってしまいましたので、今後同じことに困った際に思い出せるように記事にしておこうと思います。

やりたいこと

タイトルに記載した通り、Lambda (python3.9) からDynamoDBにクエリを実行した際のフィルタとして「~を含まない」を実装する事です。マネジメントコンソール上からは、画像の通り簡単に実行できます。

条件で「次を含まない」が選択できる。

 

参照ドキュメント

公式ドキュメント

Boto3 documentation

比較演算子および関数リファレンス

 

コードと実行結果

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)

テスト用のテーブルで実行した結果

テスト用のテーブルは以下のような感じでつくってあります。

techharmony
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,
・・・以下略

以上となります。

タイトルとURLをコピーしました