メニュー
Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

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

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

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

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

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

  1. Java 開発環境に次のプログラムをコピーアンドペーストします。

    // Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. // Licensed under the Apache License, Version 2.0. package com.amazonaws.codesamples.gsg; import java.util.HashMap; import java.util.Map; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Item; import com.amazonaws.services.dynamodbv2.document.PutItemOutcome; import com.amazonaws.services.dynamodbv2.document.Table; public class MoviesItemOps01 { public static void main(String[] args) throws Exception { AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2")) .build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("Movies"); int year = 2015; String title = "The Big New Movie"; final Map<String, Object> infoMap = new HashMap<String, Object>(); infoMap.put("plot", "Nothing happens at all."); infoMap.put("rating", 0); try { System.out.println("Adding a new item..."); PutItemOutcome outcome = table .putItem(new Item().withPrimaryKey("year", year, "title", title).withMap("info", infoMap)); System.out.println("PutItem succeeded:\n" + outcome.getPutItemResult()); } catch (Exception e) { System.err.println("Unable to add item: " + year + " " + title); System.err.println(e.getMessage()); } } }

    注記

    プライマリキーは必須です。このコードは、プライマリキー (yeartitle) と info 属性を持つ項目を追加します。info 属性には、映画についての詳細情報を示すサンプル JSON が保存されます。

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

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

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

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

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

  1. Java 開発環境に次のプログラムをコピーアンドペーストします。

    // Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. // Licensed under the Apache License, Version 2.0. package com.amazonaws.codesamples.gsg; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Item; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.document.spec.GetItemSpec; public class MoviesItemOps02 { public static void main(String[] args) throws Exception { AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2")) .build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("Movies"); int year = 2015; String title = "The Big New Movie"; GetItemSpec spec = new GetItemSpec().withPrimaryKey("year", year, "title", title); try { System.out.println("Attempting to read the item..."); Item outcome = table.getItem(spec); System.out.println("GetItem succeeded: " + outcome); } catch (Exception e) { System.err.println("Unable to read item: " + year + " " + title); System.err.println(e.getMessage()); } } }
  2. コンパイルして、プログラムを実行します。

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

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

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

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

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

項目の変更前:

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

項目の変更後:

{ year: 2015, title: "The Big New Movie", info: { plot: "Everything happens all at once.", rating: 5.5, actors: ["Larry", "Moe", "Curly"] } }
  1. Java 開発環境に次のプログラムをコピーアンドペーストします。

    // Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. // Licensed under the Apache License, Version 2.0. package com.amazonaws.codesamples.gsg; import java.util.Arrays; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.document.UpdateItemOutcome; import com.amazonaws.services.dynamodbv2.document.spec.UpdateItemSpec; import com.amazonaws.services.dynamodbv2.document.utils.ValueMap; import com.amazonaws.services.dynamodbv2.model.ReturnValue; public class MoviesItemOps03 { public static void main(String[] args) throws Exception { AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2")) .build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("Movies"); int year = 2015; String title = "The Big New Movie"; UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("year", year, "title", title) .withUpdateExpression("set info.rating = :r, info.plot=:p, info.actors=:a") .withValueMap(new ValueMap().withNumber(":r", 5.5).withString(":p", "Everything happens all at once.") .withList(":a", Arrays.asList("Larry", "Moe", "Curly"))) .withReturnValues(ReturnValue.UPDATED_NEW); try { System.out.println("Updating the item..."); UpdateItemOutcome outcome = table.updateItem(updateItemSpec); System.out.println("UpdateItem succeeded:\n" + outcome.getItem().toJSONPretty()); } catch (Exception e) { System.err.println("Unable to update item: " + year + " " + title); System.err.println(e.getMessage()); } } }

    注記

    このプログラムでは、UpdateExpression を使用して、指定された項目で実行するすべての更新を記述します。

    ReturnValues パラメーターは、DynamoDB に更新された属性 (UPDATED_NEW) のみを返すように指示します。

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

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

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

次のプログラムは、映画の rating を増分する方法を示しています。実行するたびに、プログラムはこの属性を 1 つ増分します。

  1. Java 開発環境に次のプログラムをコピーアンドペーストします。

    // Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. // Licensed under the Apache License, Version 2.0. package com.amazonaws.codesamples.gsg; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.document.UpdateItemOutcome; import com.amazonaws.services.dynamodbv2.document.spec.UpdateItemSpec; import com.amazonaws.services.dynamodbv2.document.utils.ValueMap; import com.amazonaws.services.dynamodbv2.model.ReturnValue; public class MoviesItemOps04 { public static void main(String[] args) throws Exception { AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2")) .build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("Movies"); int year = 2015; String title = "The Big New Movie"; UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("year", year, "title", title) .withUpdateExpression("set info.rating = info.rating + :val") .withValueMap(new ValueMap().withNumber(":val", 1)).withReturnValues(ReturnValue.UPDATED_NEW); try { System.out.println("Incrementing an atomic counter..."); UpdateItemOutcome outcome = table.updateItem(updateItemSpec); System.out.println("UpdateItem succeeded:\n" + outcome.getItem().toJSONPretty()); } catch (Exception e) { System.err.println("Unable to update item: " + year + " " + title); System.err.println(e.getMessage()); } } }
  2. コンパイルして、プログラムを実行します。

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

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

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

  1. Java 開発環境に次のプログラムをコピーアンドペーストします。

    // Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. // Licensed under the Apache License, Version 2.0. package com.amazonaws.codesamples.gsg; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.PrimaryKey; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.document.UpdateItemOutcome; import com.amazonaws.services.dynamodbv2.document.spec.UpdateItemSpec; import com.amazonaws.services.dynamodbv2.document.utils.ValueMap; import com.amazonaws.services.dynamodbv2.model.ReturnValue; public class MoviesItemOps05 { public static void main(String[] args) throws Exception { AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2")) .build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("Movies"); int year = 2015; String title = "The Big New Movie"; UpdateItemSpec updateItemSpec = new UpdateItemSpec() .withPrimaryKey(new PrimaryKey("year", year, "title", title)).withUpdateExpression("remove info.actors[0]") .withConditionExpression("size(info.actors) > :num").withValueMap(new ValueMap().withNumber(":num", 3)) .withReturnValues(ReturnValue.UPDATED_NEW); // Conditional update (we expect this to fail) try { System.out.println("Attempting a conditional update..."); UpdateItemOutcome outcome = table.updateItem(updateItemSpec); System.out.println("UpdateItem succeeded:\n" + outcome.getItem().toJSONPretty()); } catch (Exception e) { System.err.println("Unable to update item: " + year + " " + title); System.err.println(e.getMessage()); } } }
  2. コンパイルして、プログラムを実行します。

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

    The conditional request failed

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

  3. ConditionExpression が次のようになるようにプログラムを変更します。

    .withConditionExpression("size(info.actors) >= :num")

    条件が、3 より大きいではなく 3 以上になりました。

  4. コンパイルして、プログラムを実行します。これで、UpdateItem オペレーションが成功します。

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

プライマリキーを指定することで、deleteItem メソッドを使用して 1 つの項目を削除できます。オプションで ConditionExpression を指定して、条件を満たさない場合に項目の削除を防ぐことができます。

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

  1. Java 開発環境に次のプログラムをコピーアンドペーストします。

    // Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. // Licensed under the Apache License, Version 2.0. package com.amazonaws.codesamples.gsg; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.PrimaryKey; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.document.spec.DeleteItemSpec; import com.amazonaws.services.dynamodbv2.document.utils.ValueMap; public class MoviesItemOps06 { public static void main(String[] args) throws Exception { AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2")) .build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("Movies"); int year = 2015; String title = "The Big New Movie"; DeleteItemSpec deleteItemSpec = new DeleteItemSpec() .withPrimaryKey(new PrimaryKey("year", year, "title", title)).withConditionExpression("info.rating <= :val") .withValueMap(new ValueMap().withNumber(":val", 5.0)); // Conditional delete (we expect this to fail) try { System.out.println("Attempting a conditional delete..."); table.deleteItem(deleteItemSpec); System.out.println("DeleteItem succeeded"); } catch (Exception e) { System.err.println("Unable to delete item: " + year + " " + title); System.err.println(e.getMessage()); } } }
  2. コンパイルして、プログラムを実行します。

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

    The conditional request failed

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

  3. DeleteItemSpec で条件を削除するようにプログラムを変更します。

    DeleteItemSpec deleteItemSpec = new DeleteItemSpec() .withPrimaryKey(new PrimaryKey("year", 2015, "title", "The Big New Movie"));
  4. コンパイルして、プログラムを実行します。ここでは、条件を削除したため、削除が成功します。