[英]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.