Node.js 无法更新Dynamo Db表,正在获取ValidationException
我需要只使用分区键来更新我的dynamo db表。但我有一个例外。 我创建了一个包含3个字段的表Node.js 无法更新Dynamo Db表,正在获取ValidationException,node.js,amazon-web-services,amazon-dynamodb,aws-sdk,nosql,Node.js,Amazon Web Services,Amazon Dynamodb,Aws Sdk,Nosql,我需要只使用分区键来更新我的dynamo db表。但我有一个例外。 我创建了一个包含3个字段的表 id(分区键) 名称(排序键) 年龄 然后我只使用id更新年龄字段(尝试将年龄修改为30到40岁)。这是我的代码 var AWS = require("aws-sdk"); AWS.config.update({ region: "us-east-1", }); var params = { TableName: 'test', Key: { id: '100' },
var AWS = require("aws-sdk");
AWS.config.update({
region: "us-east-1",
});
var params = {
TableName: 'test',
Key: { id: '100' },
UpdateExpression: 'set #age = :age ',
ConditionExpression: '#age = :testAge',
ExpressionAttributeNames: { '#age': 'age' },
ExpressionAttributeValues: { ':age': '40', ':testAge': '30' }
};
var docClient = new AWS.DynamoDB.DocumentClient();
docClient.update(params, function (err, data) {
if (err) {
console.log(err);
}
else {
console.log(data);
}
});
但我犯了这样的错误
{ [ValidationException: The provided key element does not match the schema]
message: 'The provided key element does not match the schema',
code: 'ValidationException',
time: Thu Nov 17 2016 22:38:01 GMT+0530 (IST),
requestId: '34PNMFM6CEACQIRHTSV77OI0JRVV4KQNSO5AEMVJF66Q9ASUAAJG',
statusCode: 400,
retryable: false,
retryDelay: 0 }
得到错误后,我修改了params变量,如下所示
var params = {
TableName: 'test',
Key: { id: '100',name: 'manaf' },
UpdateExpression: 'set #age = :age ',
ConditionExpression: '#age = :testAge',
ExpressionAttributeNames: { '#age': 'age' },
ExpressionAttributeValues: { ':age': '40', ':testAge': '30' }
};
使用此选项,更新将成功完成。如何在不使用排序键的情况下更新表?目前,DynamoDB update API没有仅按分区键更新项的选项。也没有类似于batchWriteItem的batchUpdateItem API 因此,如果排序键不可用,则获取分区键的所有排序键,并更新分区和排序键组合的每个项 对于主键,必须提供所有属性。对于 例如,对于一个简单的主键,您只需要提供一个值 对于分区键。对于复合主键,必须提供 分区键和排序键的值 示例代码:- 您可能需要为您的桌子更换它。下面的代码使用“Movies”表,其中“yearkey”作为分区键,“title”作为排序键 下面的代码更新给定哈希键“2012”的“createdate”属性 变量paramsUpdate是根据查询操作形成的。请根据您的要求进行相应更新(即表格结构)。逻辑保持不变,只需相应地更改表名和键值
var AWS = require("aws-sdk");
var creds = new AWS.Credentials('akid', 'secret', 'session');
AWS.config.update({
region : "us-west-2",
endpoint : "http://localhost:8000",
credentials : creds
});
var docClient = new AWS.DynamoDB.DocumentClient();
var hashKey = 2012;
var paramsQuery = {
TableName : "Movies",
KeyConditionExpression : 'yearkey = :hkey',
ExpressionAttributeValues : {
':hkey' : hashKey
}
};
function updateItem(paramsUpdate) {
console.log("Updating the item...");
docClient.update(paramsUpdate, 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));
}
});
}
docClient.query(paramsQuery, function(err, data) {
if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err,
null, 2));
} else {
console.log(data.Count);
var itemIndex = 0;
while (itemIndex < data.Count) {
console.log('Hashkey to be updated ======>',
data.Items[itemIndex].yearkey,
';Title to be updated ========>',
data.Items[itemIndex].title);
var paramsUpdate = {
TableName : "Movies",
Key : {
"yearkey" : data.Items[itemIndex].yearkey,
"title" : data.Items[itemIndex].title
},
UpdateExpression : "set #createdate = :createdate",
ExpressionAttributeNames : {
'#createdate' : 'createdate'
},
ExpressionAttributeValues : {
':createdate' : '2016-11-17'
},
ReturnValues : 'UPDATED_NEW'
};
updateItem(paramsUpdate);
itemIndex++;
}
}
});
var AWS=require(“AWS sdk”);
var creds=新的AWS.Credentials('akid','secret','session');
AWS.config.update({
地区:“美国西部2号”,
端点:“http://localhost:8000",
证书:信誉
});
var docClient=new AWS.DynamoDB.DocumentClient();
var hashKey=2012;
变量参数={
表名:“电影”,
KeyConditionExpression:'yearkey=:hkey',
表达式属性值:{
“:hkey”:哈希键
}
};
函数updateItem(paramsUpdate){
日志(“更新项目…”);
更新(paramsUpdate,函数(err,data){
如果(错误){
console.error(“无法更新项。错误JSON:”,JSON.stringify(
err,null,2);
}否则{
log(“UpdateItem successed:”,JSON.stringify(data));
}
});
}
查询(参数,函数(错误,数据){
如果(错误){
console.error(“无法读取项。错误JSON:”,JSON.stringify(err,
空,2);
}否则{
console.log(data.Count);
var itemIndex=0;
while(itemIndex',
data.Items[itemIndex].yearkey,
“;要更新的标题========>”,
data.Items[itemIndex].title);
变量paramsUpdate={
表名:“电影”,
关键:{
“yearkey”:data.Items[itemIndex].yearkey,
“标题”:数据。项目[itemIndex]。标题
},
UpdateExpression:“设置#createdate=:createdate”,
表达式属性名称:{
“#createdate”:“createdate”
},
表达式属性值:{
“:createdate”:“2016-11-17”
},
ReturnValues:“更新的\新的”
};
updateItem(paramsUpdate);
itemIndex++;
}
}
});
在DynamoDB中,分区键+排序键被视为“复合主键”,它唯一地标识一个项(相反,Dynamo还支持简单主键,它只包含分区键)。因此,您需要同时更新项目。这就是为什么可以有两个具有相同分区键但不同排序键的项。因此,如果您只提供分区键,Dynamo将不知道要更新哪个项
对于当前表配置,更新给定分区键的项的唯一方法是使用分区键进行查询,以获取所有项,并筛选出使用预期排序键的项。然后使用分区键和排序键的组合来更新该项