繁体   English   中英

DynamoDb Nodejs - 放置和更新表

[英]DynamoDb Nodejs - Put and Update table

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

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

在你的insert命令中应该有putItems(),在更新中应该有updateItem。

在这里我给你的语法。 这是putItem即insert命令的语法

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

我已经决定回答我的问题。

事实证明,因为我正在创建一个复合键(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);
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM