Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在UpdateExpression上使用DELETE集更新DynamoDB记录在node.js中失败_Node.js_Amazon Dynamodb_Set_Aws Sdk_Aws Sdk Nodejs - Fatal编程技术网

在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])
}
})

希望它将来对其他人有用!

谢谢你指出这一点。我在下面发布我找到的实际解决方案!继续!