メニュー
Amazon DynamoDB
入門ガイド (API Version 2012-08-10)

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

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

データの読み取りと書き込みの詳細については、『Amazon DynamoDB 開発者ガイド』の「項目の操作」を参照してください。

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

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

  1. Copy the following program into a file named MoviesItemOps01.js:

    Copy
    var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient(); var table = "Movies"; var year = 2015; var title = "The Big New Movie"; var params = { TableName:table, Item:{ "year": year, "title": title, "info":{ "plot": "Nothing happens at all.", "rating": 0 } } }; console.log("Adding a new item..."); docClient.put(params, function(err, data) { if (err) { console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("Added item:", JSON.stringify(data, null, 2)); } });

    注記

    The primary key is required. This code adds an item that has a primary key (year, title) and info attributes. The info attribute stores sample JSON that provides more information about the movie.

  2. Type the following command to run the program:

    node MoviesItemOps01.js

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

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

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

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

  1. Copy the following program into a file named MoviesItemOps02.js:

    Copy
    var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient() var table = "Movies"; var year = 2015; var title = "The Big New Movie"; var params = { TableName: table, Key:{ "year": year, "title": title } }; docClient.get(params, function(err, data) { if (err) { console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("GetItem succeeded:", JSON.stringify(data, null, 2)); } });
  2. Type the following command to run the program:

    node MoviesItemOps02.js

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

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

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

  • 既存の属性の値を変更します (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. Copy the following program into a file named MoviesItemOps03.js:

    Copy
    var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient() var table = "Movies"; var year = 2015; var title = "The Big New Movie"; // Update the item, unconditionally, var params = { TableName:table, Key:{ "year": year, "title": title }, UpdateExpression: "set info.rating = :r, info.plot=:p, info.actors=:a", ExpressionAttributeValues:{ ":r":5.5, ":p":"Everything happens all at once.", ":a":["Larry", "Moe", "Curly"] }, ReturnValues:"UPDATED_NEW" }; console.log("Updating the item..."); docClient.update(params, function(err, data) { if (err) { console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2)); } });

    注記

    This program uses UpdateExpression to describe all updates you want to perform on the specified item.

    The ReturnValues parameter instructs DynamoDB to return only the updated attributes ("UPDATED_NEW").

  2. Type the following command to run the program:

    node MoviesItemOps03.js

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

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

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

  1. Copy the following program into a file named MoviesItemOps04.js:

    Copy
    var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient() var table = "Movies"; var year = 2015; var title = "The Big New Movie"; // Increment an atomic counter var params = { TableName:table, Key:{ "year": year, "title": title }, UpdateExpression: "set info.rating = info.rating + :val", ExpressionAttributeValues:{ ":val":1 }, ReturnValues:"UPDATED_NEW" }; console.log("Updating the item..."); docClient.update(params, function(err, data) { if (err) { console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2)); } });
  2. Type the following command to run the program:

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

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

その場合、項目は 3 人より多い役者がいる場合にのみ更新されます。

  1. Copy the following program into a file named MoviesItemOps05.js:

    Copy
    var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient() var table = "Movies"; var year = 2015; var title = "The Big New Movie"; // Conditional update (will fail) var params = { TableName:table, Key:{ "year": year, "title": title }, UpdateExpression: "remove info.actors[0]", ConditionExpression: "size(info.actors) > :num", ExpressionAttributeValues:{ ":num":3 }, ReturnValues:"UPDATED_NEW" }; console.log("Attempting a conditional update..."); docClient.update(params, function(err, data) { if (err) { console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2)); } });
  2. Type the following command to run the program:

    node MoviesItemOps05.js

    The program should fail with the following message:

    The conditional request failed

    This is because the movie has three actors in it, but the condition is checking for greater than three actors.

  3. Modify the program so that the ConditionExpression looks like this:

    Copy
    ConditionExpression: "size(info.actors) >= :num",

    The condition is now greater than or equal to 3 instead of greater than 3.

  4. Run the program again. The updateItem operation should now succeed.

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

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

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

  1. Copy the following program into a file named MoviesItemOps06.js:

    Copy
    var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient(); var table = "Movies"; var year = 2015; var title = "The Big New Movie"; var params = { TableName:table, Key:{ "year":year, "title":title }, ConditionExpression:"info.rating <= :val", ExpressionAttributeValues: { ":val": 5.0 } }; console.log("Attempting a conditional delete..."); docClient.delete(params, function(err, data) { if (err) { console.error("Unable to delete item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("DeleteItem succeeded:", JSON.stringify(data, null, 2)); } });
  2. Type the following command to run the program:

    node MoviesItemOps06.js

    The program should fail with the following message:

    The conditional request failed

    This is because the rating for this particular movie is greater than 5.

  3. Modify the program to remove the condition from params.

    Copy
    var params = { TableName:table, Key:{ "title":title, "year":year } };
  4. Run the program again. Now, the delete succeeds because you removed the condition.