メニュー
Amazon DynamoDB
開発者ガイド (API Version 2012-08-10)

ステップ 3: 項目を作成、読み込み、更新、削除する

このステップでは、Movies テーブルの項目で読み取り/書き込みオペレーションを実行します。

データの読み書きに関する詳細については、「DynamoDB での項目の操作」を参照してください。

ステップ 3.1: 新しい項目を作成する

このステップでは、Movies テーブルに新しい項目を追加します。

  1. 次のプログラムを Program.cs ファイルにコピーアンドペーストして、現在のコンテンツと置き換えます。

    Copy
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Amazon; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.DynamoDBv2.DocumentModel; namespace DynamoDB_intro { class Program { static void Main(string[] args) { // Get a Table object for the table that you created in Step 1 Table table = GetTableObject("Movies"); if (table == null) { PauseForDebugWindow(); return; } // Create a Document representing the movie item to be written to the table Document document = new Document(); document["year"] = 2015; document["title"] = "The Big New Movie"; document["info"] = Document.FromJson("{\"plot\" : \"Nothing happens at all.\",\"rating\" : 0}"); // Use Table.PutItem to write the document item to the table try { table.PutItem(document); Console.WriteLine("\nPutItem succeeded.\n"); } catch (Exception ex) { Console.WriteLine("\n Error: Table.PutItem failed because: " + ex.Message); PauseForDebugWindow(); return; } } public static Table GetTableObject(string tableName) { // First, set up a DynamoDB client for DynamoDB Local AmazonDynamoDBConfig ddbConfig = new AmazonDynamoDBConfig(); ddbConfig.ServiceURL = "http://localhost:8000"; AmazonDynamoDBClient client; try { client = new AmazonDynamoDBClient(ddbConfig); } catch (Exception ex) { Console.WriteLine("\n Error: failed to create a DynamoDB client; " + ex.Message); return (null); } // Now, create a Table object for the specified table Table table = null; try { table = Table.LoadTable(client, tableName); } catch (Exception ex) { Console.WriteLine("\n Error: failed to load the 'Movies' table; " + ex.Message); return (null); } return (table); } public static void PauseForDebugWindow() { // Keep the console open if in Debug mode... Console.Write("\n\n ...Press any key to continue"); Console.ReadKey(); Console.WriteLine(); } } }

    注記

    プライマリキーは必須です。このテーブルでは、プライマリキーはパーティションキー属性 (year) およびソートキー属性 (title) の両方の複合です。

    このコードでは、2 つのプライマリキー属性 (year + title) と、映画に関する詳細を保存する複雑な info 属性を持つ項目をテーブルに書き込みます。

  2. コンパイルして、プログラムを実行します。

ステップ 3.2: 項目を読み取る

前のプログラムでは、テーブルに次の項目を追加しました。

Copy
{ year: 2015, title: "The Big New Movie", info: { plot: "Nothing happens at all.", rating: 0 } }

Movies テーブルから項目を読み取る、GetItem メソッドを使用できます。 yeartitle がわかれば、Movies から項目を読み込むことができるように、プライマリキー値を指定する必要があります。

  1. 次のプログラムを Program.cs ファイルにコピーアンドペーストして、現在のコンテンツと置き換えます。

    Copy
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Amazon; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.DynamoDBv2.DocumentModel; namespace DynamoDB_intro { class Program { static void Main(string[] args) { // Get a Table object for the table that you created in Step 1 Table table = GetTableObject("Movies"); if (table == null) { PauseForDebugWindow(); return; } try { Document document = table.GetItem(2015, "The Big New Movie"); if (document != null) Console.WriteLine("\nGetItem succeeded: \n" + document.ToJsonPretty()); else Console.WriteLine("\nGetItem succeeded, but the item was not found"); } catch (Exception e) { Console.WriteLine(e.Message); } } public static Table GetTableObject(string tableName) { // First, set up a DynamoDB client for DynamoDB Local AmazonDynamoDBConfig ddbConfig = new AmazonDynamoDBConfig(); ddbConfig.ServiceURL = "http://localhost:8000"; AmazonDynamoDBClient client; try { client = new AmazonDynamoDBClient(ddbConfig); } catch (Exception ex) { Console.WriteLine("\n Error: failed to create a DynamoDB client; " + ex.Message); return (null); } // Now, create a Table object for the specified table Table table = null; try { table = Table.LoadTable(client, tableName); } catch (Exception ex) { Console.WriteLine("\n Error: failed to load the 'Movies' table; " + ex.Message); return (null); } return (table); } public static void PauseForDebugWindow() { // Keep the console open if in Debug mode... Console.Write("\n\n ...Press any key to continue"); Console.ReadKey(); Console.WriteLine(); } } }
  2. コンパイルして、プログラムを実行します。

ステップ 3.3: 項目を更新する

UpdateItem メソッドを使用して既存の項目を変更できます。既存の属性の値の更新、新しい属性の追加、または属性の削除を行えます。

このチュートリアルでは、次の更新を行います。

  • 既存の属性の値を変更します (ratingplot)。

  • 新しいリスト属性 (actors) を既存の info マップに追加します。

項目の変更前:

Copy
{ year: 2015, title: "The Big New Movie", info: { plot: "Nothing happens at all.", rating: 0 } }

項目の変更後:

Copy
{ year: 2015, title: "The Big New Movie", info: { plot: "Everything happens all at once.", rating: 5.5, actors: ["Larry", "Moe", "Curly"] } }
  1. 次のプログラムを Program.cs ファイルにコピーアンドペーストして、現在のコンテンツと置き換えます。

    Copy
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Amazon; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.DynamoDBv2.DocumentModel; namespace DynamoDB_intro { class Program { static void Main(string[] args) { // Get an AmazonDynamoDBClient for the local database AmazonDynamoDBClient client = GetLocalClient(); if (client == null) { PauseForDebugWindow(); return; } // Create an UpdateItemRequest to modify two existing nested attributes // and add a new one UpdateItemRequest updateRequest = new UpdateItemRequest() { TableName = "Movies", Key = new Dictionary<string, AttributeValue> { { "year", new AttributeValue { N = "2015" } }, { "title", new AttributeValue { S = "The Big New Movie" }} }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":r", new AttributeValue { N = "5.5" } }, { ":p", new AttributeValue { S = "Everything happens all at once!" } }, { ":a", new AttributeValue { SS = { "Larry","Moe","Curly" } } } }, UpdateExpression = "SET info.rating = :r, info.plot = :p, info.actors = :a", ReturnValues = "UPDATED_NEW" }; // Use AmazonDynamoDBClient.UpdateItem to update the specified attributes UpdateItemResponse uir = null; try { uir = client.UpdateItem(updateRequest); } catch (Exception ex) { Console.WriteLine("\nError: UpdateItem failed, because: " + ex.Message); if (uir != null) Console.WriteLine(" Status code was " + uir.HttpStatusCode.ToString()); PauseForDebugWindow(); return; } // Get the item from the table and display it to validate that the update succeeded DisplayMovieItem(client, "2015", "The Big New Movie"); } public static AmazonDynamoDBClient GetLocalClient() { // First, set up a DynamoDB client for DynamoDB Local AmazonDynamoDBConfig ddbConfig = new AmazonDynamoDBConfig(); ddbConfig.ServiceURL = "http://localhost:8000"; AmazonDynamoDBClient client; try { client = new AmazonDynamoDBClient(ddbConfig); } catch (Exception ex) { Console.WriteLine("\n Error: failed to create a DynamoDB client; " + ex.Message); return (null); } return (client); } public static void DisplayMovieItem(AmazonDynamoDBClient client, string year, string title) { // Create Primitives for the HASH and RANGE portions of the primary key Primitive hash = new Primitive(year, true); Primitive range = new Primitive(title, false); Table table = null; try { table = Table.LoadTable(client, "Movies"); } catch (Exception ex) { Console.WriteLine("\n Error: failed to load the 'Movies' table; " + ex.Message); return; } Document document = table.GetItem(hash, range); Console.WriteLine("\n The movie record looks like this: \n" + document.ToJsonPretty()); } public static void PauseForDebugWindow() { // Keep the console open if in Debug mode... Console.Write("\n\n ...Press any key to continue"); Console.ReadKey(); Console.WriteLine(); } } }

    注記

    AWS SDK for .NET のドキュメントモデルは入れ子属性の更新をサポートしないため、トップレベルの info 属性にある属性を更新するには、Table.UpdateItem ではなく、AmazonDynamoDBClient.UpdateItem API を使用する必要があります。

    そのためには、更新する項目と設定する新しい値を指定する UpdateItemRequest を作成します。

    • UpdateExpression は、指定した項目に対するすべての更新を定義します。

    • ReturnValues フィールドを "UPDATED_NEW" に設定することで、DynamoDB に対して更新された属性だけを応答で返すようリクエストします。

  2. コンパイルして、プログラムを実行します。

ステップ 3.4: アトミックカウンターを増分する

DynamoDB では、アトミックカウンターがサポートされています。そのため、UpdateItem メソッドを使用して、他の書き込みリクエストを妨げることなく既存の属性値をインクリメントまたはデクリメントできます。(すべての書き込みリクエストは、受信された順に適用されます。)

次のプログラムは、映画の rating を増分します。実行するたびに、プログラムはこの属性を 1 つ増分します。ここでも、動作は UpdateExpression によって決定されます。

Copy
UpdateExpression = "SET info.rating = info.rating + :inc",
  1. 次のプログラムを Program.cs ファイルにコピーアンドペーストして、現在のコンテンツと置き換えます。

    Copy
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Amazon; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.DynamoDBv2.DocumentModel; namespace DynamoDB_intro { class Program { static void Main(string[] args) { // Get an AmazonDynamoDBClient for the local database AmazonDynamoDBClient client = GetLocalClient(); if (client == null) { PauseForDebugWindow(); return; } // Create an UpdateItemRequest to modify two existing nested attributes // and add a new one UpdateItemRequest updateRequest = new UpdateItemRequest() { TableName = "Movies", Key = new Dictionary<string, AttributeValue> { { "year", new AttributeValue { N = "2015" } }, { "title", new AttributeValue { S = "The Big New Movie" }} }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":inc", new AttributeValue { N = "1" } } }, UpdateExpression = "SET info.rating = info.rating + :inc", ReturnValues = "UPDATED_NEW" }; // Use AmazonDynamoDBClient.UpdateItem to update the specified attributes UpdateItemResponse uir = null; try { uir = client.UpdateItem(updateRequest); } catch (Exception ex) { Console.WriteLine("\nError: UpdateItem failed, because " + ex.Message); if (uir != null) Console.WriteLine(" Status code was: " + uir.HttpStatusCode.ToString()); PauseForDebugWindow(); return; } // Get the item from the table and display it to validate that the update succeeded DisplayMovieItem(client, "2015", "The Big New Movie"); } public static AmazonDynamoDBClient GetLocalClient() { // First, set up a DynamoDB client for DynamoDB Local AmazonDynamoDBConfig ddbConfig = new AmazonDynamoDBConfig(); ddbConfig.ServiceURL = "http://localhost:8000"; AmazonDynamoDBClient client; try { client = new AmazonDynamoDBClient(ddbConfig); } catch (Exception ex) { Console.WriteLine("\n Error: failed to create a DynamoDB client; " + ex.Message); return (null); } return (client); } public static void DisplayMovieItem(AmazonDynamoDBClient client, string year, string title) { // Create Primitives for the HASH and RANGE portions of the primary key Primitive hash = new Primitive(year, true); Primitive range = new Primitive(title, false); Table table = null; try { table = Table.LoadTable(client, "Movies"); } catch (Exception ex) { Console.WriteLine("\n Error: failed to load the 'Movies' table; " + ex.Message); return; } Document document = table.GetItem(hash, range); Console.WriteLine("\n The movie record looks like this: \n" + document.ToJsonPretty()); } public static void PauseForDebugWindow() { // Keep the console open if in Debug mode... Console.Write("\n\n ...Press any key to continue"); Console.ReadKey(); Console.WriteLine(); } } }
  2. コンパイルして、プログラムを実行します。

ステップ 3.5: 項目を更新する (条件付き)

次のプログラムは、条件とともに UpdateItem を使用する方法を示しています。条件が true と評価された場合、更新は成功します。それ以外の場合、更新は行われません。

その場合、その項目は 4 人以上の役者が映画に出演している場合にのみ更新されます。

  1. 次のプログラムを Program.cs ファイルにコピーアンドペーストして、現在のコンテンツと置き換えます。

    Copy
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Amazon; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.DynamoDBv2.DocumentModel; namespace DynamoDB_intro { class Program { static void Main(string[] args) { // Get an AmazonDynamoDBClient for the local database AmazonDynamoDBClient client = GetLocalClient(); if (client == null) { PauseForDebugWindow(); return; } // Create an UpdateItemRequest to modify two existing nested attributes // and add a new one UpdateItemRequest updateRequest = new UpdateItemRequest() { TableName = "Movies", Key = new Dictionary<string, AttributeValue> { { "year", new AttributeValue { N = "2015" } }, { "title", new AttributeValue { S = "The Big New Movie" } } }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":n", new AttributeValue { N = "3" } } }, ConditionExpression = "size(info.actors) > :n", UpdateExpression = "REMOVE info.actors", ReturnValues = "UPDATED_NEW" }; // Use AmazonDynamoDBClient.UpdateItem to update the specified attributes UpdateItemResponse uir = null; try { uir = client.UpdateItem(updateRequest); } catch (Exception ex) { Console.WriteLine("\nError: UpdateItem failed, because:\n " + ex.Message); if (uir != null) Console.WriteLine(" Status code was " + uir.HttpStatusCode.ToString()); PauseForDebugWindow(); return; } if (uir.HttpStatusCode != System.Net.HttpStatusCode.OK) { PauseForDebugWindow(); return; } // Get the item from the table and display it to validate that the update succeeded DisplayMovieItem(client, "2015", "The Big New Movie"); } public static AmazonDynamoDBClient GetLocalClient() { // First, set up a DynamoDB client for DynamoDB Local AmazonDynamoDBConfig ddbConfig = new AmazonDynamoDBConfig(); ddbConfig.ServiceURL = "http://localhost:8000"; AmazonDynamoDBClient client; try { client = new AmazonDynamoDBClient(ddbConfig); } catch (Exception ex) { Console.WriteLine("\n Error: failed to create a DynamoDB client; " + ex.Message); return (null); } return (client); } public static void DisplayMovieItem(AmazonDynamoDBClient client, string year, string title) { // Create Primitives for the HASH and RANGE portions of the primary key Primitive hash = new Primitive(year, true); Primitive range = new Primitive(title, false); Table table = null; try { table = Table.LoadTable(client, "Movies"); } catch (Exception ex) { Console.WriteLine("\n Error: failed to load the 'Movies' table; " + ex.Message); return; } Document document = table.GetItem(hash, range); Console.WriteLine("\n The movie record looks like this: \n" + document.ToJsonPretty()); } public static void PauseForDebugWindow() { // Keep the console open if in Debug mode... Console.Write("\n\n ...Press any key to continue"); Console.ReadKey(); Console.WriteLine(); } } }
  2. コンパイルして、プログラムを実行します。

    プログラムは次のメッセージで失敗するはずです。

    The conditional request failed

    これは、映画に 3 人の役者が出演しているが、条件は役者が 3 人より多いことをチェックしているためです。

  3. ConditionExpression が使用する役者の人数が 3 人ではなく 2 人になるようにプログラムを変更します。

    Copy
    { ":n", new AttributeValue { N = "2" } }

    これにより、この条件は役者の人数が 2 人より大きくなる必要があることを指定します。

  4. プログラムをコンパイルして実行すると、UpdateItem オペレーションは成功するはずです。

ステップ 3.6: 項目を削除する

プライマリキーを指定することで、Table.DeleteItem オペレーションを使用して項目を削除できます。またオプションとして、DeleteItemOperationConfig パラメータに条件を指定し、条件が満たされない場合に項目が削除されるのを防ぐことができます。

次の例では、レーティングが 5 以下の特定の映画項目を削除しようとします。

  1. 次のプログラムを Program.cs ファイルにコピーアンドペーストして、現在のコンテンツと置き換えます。

    Copy
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Amazon; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.DynamoDBv2.DocumentModel; namespace DynamoDB_intro { class Program { static void Main(string[] args) { // Get a Table object for the table that you created in Step 1 Table table = GetTableObject("Movies"); if (table == null) return; // Create the condition DeleteItemOperationConfig opConfig = new DeleteItemOperationConfig(); lopConfig.ConditionalExpression = new Expression(); opConfig.ConditionalExpression.ExpressionAttributeValues[":val"] = "5.0"; opConfig.ConditionalExpression.ExpressionStatement = "info.rating <= :val"; // Delete this item try { table.DeleteItem(2015, "The Big New Movie", opConfig); } catch (Exception ex) { Console.WriteLine("\n Error: Could not delete the movie item with year={0}, title=\"{1}\"\n Reason: {2}.", 2015, "The Big New Movie", ex.Message); } // Try to retrieve it, to see if it has been deleted Document document = table.GetItem(2015, "The Big New Movie"); if (document == null) Console.WriteLine("\n The movie item with year={0}, title=\"{1}\" has been deleted.", 2015, "The Big New Movie"); else Console.WriteLine("\nRead back the item: \n" + document.ToJsonPretty()); // Keep the console open if in Debug mode... Console.Write("\n\n ...Press any key to continue"); Console.ReadKey(); Console.WriteLine(); } public static Table GetTableObject(string tableName) { // First, set up a DynamoDB client for DynamoDB Local AmazonDynamoDBConfig ddbConfig = new AmazonDynamoDBConfig(); ddbConfig.ServiceURL = "http://localhost:8000"; AmazonDynamoDBClient client; try { client = new AmazonDynamoDBClient(ddbConfig); } catch (Exception ex) { Console.WriteLine("\n Error: failed to create a DynamoDB client; " + ex.Message); return (null); } // Now, create a Table object for the specified table Table table = null; try { table = Table.LoadTable(client, tableName); } catch (Exception ex) { Console.WriteLine("\n Error: failed to load the 'Movies' table; " + ex.Message); return (null); } return (table); } } }
  2. コンパイルして、プログラムを実行します。

    プログラムは次のメッセージで失敗するはずです。

    The conditional request failed

    これは、この特定の映画のレーティングが 5 より大きいためです。

  3. table.DeleteItem への呼び出しで opConfig という名前の DeleteItemOperationConfig を削除するためにプログラムを変更します。

    Copy
    try { table.DeleteItem( 2015, "The Big New Movie" ); }
  4. コンパイルして、プログラムを実行します。ここでは、条件を削除したため、削除が成功します。