DynamoDB 更新 - "ValidationException: An operand in the update expression has an incorrect data type"
DynamoDB update - "ValidationException: An operand in the update expression has an incorrect data type"
我正在尝试追加到 DynamoDB table 中可能已经存在也可能不存在的字符串集(字符串数组)列。我在写我的 UpdateExpression 时提到了像 and 这样的问题。
我的代码是这样的。
const AWS = require('aws-sdk')
const dynamo = new AWS.DynamoDB.DocumentClient()
const updateParams = {
// The table definitely exists.
TableName: process.env.DYNAMO_TABLE_NAME,
Key: {
email: user.email
},
// The column may or may not exist, which is why I am combining list_append with if_not_exists.
UpdateExpression: 'SET #column = list_append(if_not_exists(#column, :empty_list), :vals)',
ExpressionAttributeNames: {
'#column': 'items'
},
ExpressionAttributeValues: {
':vals': ['test', 'test2'],
':empty_list': []
},
ReturnValues: 'UPDATED_NEW'
}
dynamo.update(updateParams).promise().catch((error) => {
console.log(`Error: ${error}`)
})
但是,我收到此错误:ValidationException: An operand in the update expression has an incorrect data type
。我在这里做错了什么?
[更新]
感谢 Nadav Har'El 的回答,我能够通过修改参数以使用 ADD
操作而不是 SET
.
来使其工作
const updateParams = {
TableName: process.env.DYNAMO_TABLE_NAME,
Key: {
email: user.email
},
UpdateExpression: 'ADD items :vals',
ExpressionAttributeValues: {
':vals': dynamo.createSet(['test', 'test2'])
}
}
A list 和 string set 不是同一类型 - 字符串集只能包含字符串,而列表可以包含任何字符串类型(包括嵌套列表和对象),元素类型不需要相同,列表也可以包含重复项。所以如果你原来的项目确实如你所说一个字符串集,而不是一个列表,这就解释了为什么这个操作不起作用。
要将项目添加到字符串集中,请使用 ADD
操作,而不是 SET
操作。您要添加的参数应该是一组元素(不是列表,我不知道指定它的神奇 js 语法,请检查您的文档)。如果属性已经存在,这些元素将被添加到它(删除重复项),如果属性尚未存在,它将被设置为这些元素的集合。请参阅此处的文档:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html#DDB-UpdateItem-request-UpdateExpression
我正在尝试追加到 DynamoDB table 中可能已经存在也可能不存在的字符串集(字符串数组)列。我在写我的 UpdateExpression 时提到了像
我的代码是这样的。
const AWS = require('aws-sdk')
const dynamo = new AWS.DynamoDB.DocumentClient()
const updateParams = {
// The table definitely exists.
TableName: process.env.DYNAMO_TABLE_NAME,
Key: {
email: user.email
},
// The column may or may not exist, which is why I am combining list_append with if_not_exists.
UpdateExpression: 'SET #column = list_append(if_not_exists(#column, :empty_list), :vals)',
ExpressionAttributeNames: {
'#column': 'items'
},
ExpressionAttributeValues: {
':vals': ['test', 'test2'],
':empty_list': []
},
ReturnValues: 'UPDATED_NEW'
}
dynamo.update(updateParams).promise().catch((error) => {
console.log(`Error: ${error}`)
})
但是,我收到此错误:ValidationException: An operand in the update expression has an incorrect data type
。我在这里做错了什么?
[更新]
感谢 Nadav Har'El 的回答,我能够通过修改参数以使用 ADD
操作而不是 SET
.
const updateParams = {
TableName: process.env.DYNAMO_TABLE_NAME,
Key: {
email: user.email
},
UpdateExpression: 'ADD items :vals',
ExpressionAttributeValues: {
':vals': dynamo.createSet(['test', 'test2'])
}
}
A list 和 string set 不是同一类型 - 字符串集只能包含字符串,而列表可以包含任何字符串类型(包括嵌套列表和对象),元素类型不需要相同,列表也可以包含重复项。所以如果你原来的项目确实如你所说一个字符串集,而不是一个列表,这就解释了为什么这个操作不起作用。
要将项目添加到字符串集中,请使用 ADD
操作,而不是 SET
操作。您要添加的参数应该是一组元素(不是列表,我不知道指定它的神奇 js 语法,请检查您的文档)。如果属性已经存在,这些元素将被添加到它(删除重复项),如果属性尚未存在,它将被设置为这些元素的集合。请参阅此处的文档:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html#DDB-UpdateItem-request-UpdateExpression