在UpdateExpression上使用DELETE集更新DynamoDB记录在node.js中失败
我正在尝试使用在UpdateExpression上使用DELETE集更新DynamoDB记录在node.js中失败,node.js,amazon-dynamodb,set,aws-sdk,aws-sdk-nodejs,Node.js,Amazon Dynamodb,Set,Aws Sdk,Aws Sdk Nodejs,我正在尝试使用AWS SDK对DynamoDB.DocumentClient实例执行更新调用,有效负载位于下面的代码段中: const AWS=require('AWS-sdk') const DynamoDB=new AWS.DynamoDB.DocumentClient() ... const TableName='MyTable' 常量键={PK:'MyPK',SK:'MySK'} 常量操作='DELETE' 常量myId='abcde' const currentRecord=wait
AWS SDK
对DynamoDB.DocumentClient
实例执行更新调用,有效负载位于下面的代码段中:
const AWS=require('AWS-sdk')
const DynamoDB=new AWS.DynamoDB.DocumentClient()
...
const TableName='MyTable'
常量键={PK:'MyPK',SK:'MySK'}
常量操作='DELETE'
常量myId='abcde'
const currentRecord=wait DynamoDB.get({TableName,Key)
DynamoDB.update({
表名,
钥匙
UpdateExpression:`
${operation}myid:valuesToModify,
版本:incrementVersionBy
`,
条件表达式:`version=:version`,
表达式属性值:{
“:version”:currentRecord.version,
“:incrementVersionBy”:1,
“:valuesToModify”:DynamoDB.createSet([myId])
}
})...
我得到这个错误的结果是:
错误调用错误
{
“errorType”:“Error”,
“errorMessage”:“ValidationException:无效的UpdateExpression:运算符或函数的操作数类型不正确;
运算符:删除,操作数类型:数字,排版:允许删除操作数“,
“堆栈”:[…]
}
有趣的是,如果将操作
更改为添加
,则效果良好
非常感谢任何有助于理解为什么
ADD
有效而不是DELETE
和/或如何修复和/或替代与此更新操作兼容的方法的线索!这里唯一可行的解决方法是不使用DELETE操作,而是查询项目,在要删除的数组,并通过删除操作将其删除:
与本例类似,arrayField包含一个用户数组,我想按用户的电话号码删除
const dataStore = await dynamodb.get(queryParams).promise();
let i=0; //save the index
for(i = 0; i < dataStore.Item.myTable.length; i++){
if(dataStore.Item.arrayField[i].phone === phoneNumber)
{
break;
}
}
if(i < dataStore.Item.arrayField.length){
const updateStoreParams = {
TableName: tableName,
Key: storeTableKey,
UpdateExpression: `REMOVE arrayField[${i}]`,
}
await dynamodb.update(updateStoreParams).promise().catch((err) => {
console.log(err);
throw err;
});
}
const dataStore=wait dynamodb.get(queryParams.promise();
设i=0;//保存索引
对于(i=0;i{
控制台日志(err);
犯错误;
});
}
这是一个我没有注意到的语义错误
当${operation}
为ADD
时,UpdateExpression
的version
字段将起作用,因为它是一个数值增量
当${operation}
为DELETE
时,版本
不起作用,因为正如错误所述,它是运算符或函数的操作数类型不正确
,因为它只适用于文档
这个错误一开始有点误导人,但当我尝试用其他SDK实现时,我最终遇到了相同的错误,然后我尝试将注意力集中在UpdateExpression
部分,发现我必须重构到类似这样的东西才能使其工作:
//请注意,如果操作是DELETE,我将插入ADD,否则将插入逗号
DynamoDB.update({
表名,
钥匙
UpdateExpression:`
${operation}socketId:valuesToModify
${operation=='DELETE'?'ADD':','}版本:incrementVersionBy
`,
条件表达式:`version=:version`,
表达式属性值:{
“:version”:channelRecord.version,
“:incrementVersionBy”:1,
“:valuesToModify”:DynamoDB.createSet([socketId])
}
})
希望它将来对其他人有用!谢谢你指出这一点。我在下面发布我找到的实际解决方案!继续!