DynamoDb Nodejs - 放置和更新表

时间:2016-04-15 09:53:24

标签: node.js amazon-dynamodb

我在dynamoDB中有以下表格,我想在第一个实例上写value1并将value2留空。然后我运行额外的代码,然后我才想用value2更新该项目。 我是dynamodb的新手,所以我遇到了一些麻烦。

如何设置我的表,以便第一次写入只能包含value1,第二次写入更新项目value2

目前,我在尝试更新时遇到以下错误: ValidationException: The provided key element does not match the schema

我运行以下脚本来创建我的Id-map-table

var params3 = {
    TableName : "my-Id-map",
    KeySchema: [
        { AttributeName: "value1", KeyType: "HASH" },
        { AttributeName: "value2", KeyType: "RANGE"}
    ],
    AttributeDefinitions: [
        { AttributeName: "value1", AttributeType: "S" },
        { AttributeName: "value2", AttributeType: "S" }
    ],
    ProvisionedThroughput: {
        ReadCapacityUnits: 10,
        WriteCapacityUnits: 10
    }
};

dynamodb.describeTable({TableName:"my-Id-map"}, function(err,result) {
     if (err) {
        createIdMapTable();
     }
   else {
        console.log("Table my-Id-map already exists");
    }
});

function createIdMapTable()
{
    dynamodb.createTable(params3, function(err, data) {
        if (err) {
            console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
        }
    });
}

我按以下方式执行第一次写作:

itemManager.saveItemsId = function (value2, value1, callback) {

  value2 = value2.toString();
  value1 = value1.toString();

  var params = {
    TableName: 'my-Id-map',
    Item:{
      "value1": value1,
      "value2": value2
    }
  };

  dynamodb.put(params, callback);
};

我想update我的项目如下:

    itemManager.updateItemId = function (value2, value1, callback) {
  value2 = value2.toString();
  value1 = value1.toString();

  var params = {
    TableName: 'my-Id-map',
    Key : {
      "value1" : {
        "S" : value1
      }
    },
    UpdateExpression : "SET #attrName =:attrValue",
    ExpressionAttributeNames : {
      "#attrName" : "value2"
    },
    ExpressionAttributeValues : {
      ":attrValue" : {
        "S" : value2
      }
    }
  };

  dynamodb.update(params, callback);
};

2 个答案:

答案 0 :(得分:4)

我可以看到你的createTable()和describeTable()语法是正确的但更新和插入命令是错误的。

在你的insert命令中应该有putItems(),并且在update中应该有updateItem。

这里我给你的语法。 这是 putItem即插入命令

的语法
itemManager.saveItemsId = function(value2, value1, callback) {

value2 = value2.toString();
value1 = value1.toString();

var params = {
    TableName: 'my-Id-map',
    Item: {
        'value1': {
            'S': value1
        },
        'vallue2': {
            'S': value2
        }
    }
};
dynamodb.putItem(params, function(err, result) {
    if (err) {
        console.log("Error")
    } else {
        console.log("Data saved Success")
    }
})

};

对于更新表:

itemManager.updateItemId = function(value2, value1, callback) {

value2 = value2.toString();
value1 = value1.toString();

var params = {
    TableName: 'my-Id-map',
    Key: {
        id: {
            'S': id
        }
    },
    UpdateExpression: 'SET #attrName =:attrValue',
    ExpressionAttributeNames: {
        "#attrName": "value2"
    },
    ExpressionAttributeValues: {
        ':attrValue': {
            'S': value2
        },
    }
};
dynamodb.updateItem(params, function(err, data) {
    if (err) {
        console.log("Error while update")

    } else {
        console.log("Data updated Successfully")
    }
})

};

您也可以参考此链接dynamodbSyntax

答案 1 :(得分:3)

我决定回答我的问题。

事实证明,因为我正在创建一个复合键(HASH + RANGE),我正在尝试更新密钥本身,而dynamodb抱怨这一点。我需要改变创建表的方式,只有一个HASH键才能使其余的工作。

创建表应该是:

var params3 = {
    TableName : "my-Id-map",
    KeySchema: [
        { AttributeName: "value1", KeyType: "HASH" }
    ],
    AttributeDefinitions: [
        { AttributeName: "value1", AttributeType: "S" }
    ],
    ProvisionedThroughput: {
        ReadCapacityUnits: 10,
        WriteCapacityUnits: 10
    }
};

所以写一个项目:

itemManager.saveItemsId = function (value1, callback) {
  value1 = value1.toString();

  var params = {
    TableName: 'my-Id-map',
    Item:{
      "value1": value1
    }
  };

  dynamodb.put(params, callback);
};

并更新:

itemManager.updateItemId = function (value2, value1, callback) {
  value2 = value2.toString();
  value1 = value1.toString();

  var params = {
    TableName: 'my-Id-map',
    Key : {
      "value1" : value1
    },
    UpdateExpression : "SET #attrName =:attrValue",
    ExpressionAttributeNames : {
      "#attrName" : "value2"
    },
    ExpressionAttributeValues : {
      ":attrValue" : value2
    }
  };

  dynamodb.update(params, callback);
};