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

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

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

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

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

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

  1. 次のプログラムを MoviesItemOps01.js というファイルにコピーします。

    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));
        }
    });
    

    Note

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

  2. 次のコマンドを入力してコマンドを実行します。

    node MoviesItemOps01.js

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

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

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

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

  1. 次のプログラムを MoviesItemOps02.js というファイルにコピーします。

    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. 次のコマンドを入力してコマンドを実行します。

    node MoviesItemOps02.js

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

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

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

  • 既存の属性の値を変更します (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. 次のプログラムを MoviesItemOps03.js というファイルにコピーします。

    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));
        }
    });
    

    Note

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

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

  2. 次のコマンドを入力してコマンドを実行します。

    node MoviesItemOps03.js

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

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

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

  1. 次のプログラムを MoviesItemOps04.js というファイルにコピーします。

    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. 次のコマンドを入力してコマンドを実行します。

    node MoviesItemOps04.js

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

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

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

  1. 次のプログラムを MoviesItemOps05.js というファイルにコピーします。

    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. 次のコマンドを入力してコマンドを実行します。

    node MoviesItemOps05.js

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

    The conditional request failed

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

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

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

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

  4. プログラムを再度実行します。これで、updateItem オペレーションが成功します。

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

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

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

  1. 次のプログラムを MoviesItemOps06.js というファイルにコピーします。

    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. 次のコマンドを入力してコマンドを実行します。

    node MoviesItemOps06.js

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

    The conditional request failed

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

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

    
    var params = {
        TableName:table,
        Key:{
            "title":title,
            "year":year
        }
    };
  4. プログラムを再度実行します。ここでは、条件を削除したため、削除が成功します。

次のステップ

ステップ 4: データをクエリおよびスキャンする