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