DynamoDB

最終更新日:2025/08/17

NoSQLのテーブル設計って難しいよね

パッケージ

「AWSSDK.DynamoDBv2」を使用する。

・NuGet
NuGet Gallery | AWSSDK.DynamoDBv2
https://www.nuget.org/packages/AWSSDK.DynamoDBv2/

このページで使用するパッケージは以下の2つ。

using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;

操作用クラス

クライアント

クライアントは様々な操作ができるが、マッピングはなし。
このページではクライアントでの操作方法はないので、知りたい人は公式ガイドを見てね。

AmazonDynamoDBClient dynamoDBClient;
AmazonDynamoDBConfig dynamoDBConfig = new()
{
    RegionEndpoint = Amazon.RegionEndpoint.APNortheast1,
};
dynamoDBClient = new(dynamoDBConfig);

コンテキスト

クライアントに比べてできることは限られているが、マッピングをやってくれる。
やることが読み書きぐらいであれば、コンテキストを使用したほうが楽。

DynamoDBContext dynamoDBContext;
dynamoDBContext = new DynamoDBContextBuilder()
    .WithDynamoDBClient(() => dynamoDBClient)
    .Build();

マッピング

コンテキストによるマッピング用のクラスの作り方。
基本的には属性でテーブルと合うように指定するだけ。
属性や型の詳しい解説は公式ガイドを見てね。

・.NET オブジェクト永続性モデルと DynamoDB の使用
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DotNetSDKHighLevel.html

・.NET オブジェクト永続性モデルからの DynamoDB 属性
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DeclarativeTagsList.html

よく使う属性

・DynamoDBTable属性
対象のテーブル名を指定

・DynamoDBHashKey属性
パーティションキーを指定

・DynamoDBRangeKey属性
ソートキーを指定

・DynamoDBProperty属性
上記以外の項目属性を指定

クラス例

下記のテーブルのマッピング用クラスを作る。
テーブル名は映ってないけど「inventory_table」で定義してある。
dynamodb_01.png

・InventoryTable.cs

[DynamoDBTable("inventory_table")]
public record InventoryTable
{

    [DynamoDBHashKey("item_location")]
    public required string Location { get; set; }

    [DynamoDBRangeKey("item_id")]
    public required string ID { get; set; }

    [DynamoDBProperty("item_name")]
    public required string Name { get; set; }

    [DynamoDBProperty("item_quantity")]
    public required int Quantity { get; set; }

    [DynamoDBProperty("item_history")]
    public List<HistoryInfo> History { get; set; } = [];

}

public record HistoryInfo
{

    [DynamoDBProperty("history_registered_at")]
    public required DateTime RegisteredAt { get; set; }

    [DynamoDBProperty("history_remark")]
    public required string Remark { get; set; }

}

データ読み込み

パーティションキー指定

パーティションキーを指定して読み込む。

IEnumerable<T> items = await dynamoDBContext
    .QueryAsync<T>("パーティションキー")
    .GetRemainingAsync();

パーティションキーとソートキー指定

パーティションキーとソートキーを指定して読み込む。

T item = await dynamoDBContext.LoadAsync<T>("パーティションキー", "ソートキー");

任意の項目属性を指定

Scanはコストが高いからオススメしないよ!
また、指定する項目属性はテーブル上での名称ではなく、マッピングしたクラスの名称を指定すること。
下記であればテーブル上では「item_name」だけど、マッピングしたクラスでは「Name」で定義してあるので、「Name」を指定する必要がある。

// ↓こっちの名称じゃなくて
[DynamoDBProperty("item_name")]
public required string Name { get; set; }
// ↑こっちの名称
List<ScanCondition> conditions =
[
    new("Name", ScanOperator.Equal, "みかん")
];
IEnumerable<T> items = await dynamoDBContext
    .ScanAsync<T>(conditions)
    .GetRemainingAsync();

データ書き込み

単一書き込み

await dynamoDBContext.SaveAsync<T>(item);

複数書き込み(トランザクションあり)

複数のデータをまとめて書き込む場合はこちら。

ITransactWrite<T> transactWrite = dynamoDBContext.CreateTransactWrite<T>();
transactWrite.AddSaveItems(items);
await transactWrite.ExecuteAsync();

データ削除

単一削除

await dynamoDBContext.DeleteAsync<T>(item);

複数削除(トランザクションあり)

複数のデータをまとめて削除する場合はこちら。

ITransactWrite<T> transactWrite = dynamoDBContext.CreateTransactWrite<T>();
transactWrite.AddDeleteItems(items);
await transactWrite.ExecuteAsync();

リンク

公式ガイド

・.NET コード例
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/CodeSamples.DotNet.html


メインページに戻る