サーバレス練習帳

着眼大局着手小局

DynamoDBがマッチするもの、しないもの

https://tech.revcomm.co.jp/partial-match-search-with-dynamodb

クエリに前方一致をかけられるわ。
https://qiita.com/YukiMiyatake/items/c3f13d32d90d15e5cfe0

GSIとLSI
https://makky12.hatenablog.com/entry/2020/02/14/000000

同じパーティションキーでソートキーを増やしたいだけなら、LSIとのこと。
曰く、LSIはソートキーを増やすのが目的なのだとか。

import boto3

# DynamoDBのリソースを作成
dynamodb = boto3.resource('dynamodb')

# テーブル名とLSIの定義
table_name = 'YourTableName'
lsi_name = 'OrgIndex'
lsi_key_name = 'org'  # LSIのソートキーの属性名

# テーブルの作成
table = dynamodb.create_table(
    TableName=table_name,
    KeySchema=[
        {
            'AttributeName': 'object_name',  # パーティションキー
            'KeyType': 'HASH'  # ハッシュキーを指定
        },
        {
            'AttributeName': 'id',  # ソートキー
            'KeyType': 'RANGE'  # レンジキーを指定
        }
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'object_name',
            'AttributeType': 'S'  # 文字列型
        },
        {
            'AttributeName': 'id',
            'AttributeType': 'S'  # 文字列型
        },
        {
            'AttributeName': 'org',
            'AttributeType': 'S'  # 文字列型 (LSIのソートキー)
        }
    ],
    BillingMode='PAY_PER_REQUEST',  # On-Demand モードを指定
    LocalSecondaryIndexes=[
        {
            'IndexName': lsi_name,
            'KeySchema': [
                {
                    'AttributeName': 'object_name',  # パーティションキー
                    'KeyType': 'HASH'  # ハッシュキーを指定
                },
                {
                    'AttributeName': 'org',  # LSIのソートキー
                    'KeyType': 'RANGE'  # レンジキーを指定
                }
            ],
            'Projection': {
                'ProjectionType': 'ALL'  # インデックスに含める属性の指定(ALLで全ての属性を含む)
            }
        }
    ]
)

# テーブルの作成完了を待機
table.meta.client.get_waiter('table_exists').wait(TableName=table_name)

# テーブルが作成されたことを確認
print(f'Table {table_name} created successfully with LSI {lsi_name}')

# テーブルへのデータ挿入(例として)
table.put_item(
    Item={
        'object_name': 'intestments',
        'id': '1',
        'org': 'MI事業本部',
        # その他の属性を必要に応じて追加
    }
)

# クエリの実行例
from boto3.dynamodb.conditions import Key

# テーブルオブジェクトを取得
table = dynamodb.Table(table_name)

# クエリの実行
response = table.query(
    IndexName=lsi_name,  # 使用するインデックス名を指定
    KeyConditionExpression=Key('object_name').eq('intestments') & Key('org').eq('MI事業本部')
)

# 結果の表示
print('Query Results:')
for item in response['Items']:
    print(item)
import boto3
from boto3.dynamodb.conditions import Key

# DynamoDBのリソースを作成
dynamodb = boto3.resource('dynamodb')

# テーブル名とLSIの定義
table_name = 'YourTableName'
lsi_name = 'OrgIndex'  # LSIの名前

# テーブルオブジェクトを取得
table = dynamodb.Table(table_name)

# クエリの実行
response = table.query(
    IndexName=lsi_name,  # 使用するLSIの名前を指定
    KeyConditionExpression=Key('object_name').eq('intestments') & Key('org').begins_with('MI事業')
)

# 結果の表示
print('Query Results:')
for item in response['Items']:
    print(item)