我正在尝试以下代码
{
ExpressionAttributeNames: {
"#items": "items"
},
ExpressionAttributeValues: {
":item": [slug]
},
Key: {
listId: listId,
userId: userData.userId,
},
UpdateExpression: "SET #items = list_append(#items,:item)",
ConditionExpression: "NOT contains (#items, :item)",
TableName: process.env.listsTableName,
}
,即使列表中已经存在字符串,该项目仍会添加。我在做什么错了?
列表结构如下:
{
Item: {
userId: userData.userId,
listId: crypto.createHash('md5').update(Date.now() + userData.userId).digest('hex'),
listName: 'Wishlist',
items: [],
},
TableName: process.env.listsTableName,
};
后来编辑:我知道我应该使用SS,因为它会满足我的条件,但是SS在我的上下文中不起作用,因为SS不能为空。
答案 0 :(得分:0)
如the documentation所述,contains()
函数仅适用于字符串值(检查子字符串)或 set 值(检查成员资格)。但是在您的情况下,您没有集合而是一个列表-DynamoDB中有不同的内容。
如果要添加到此列表的所有项目都是字符串,并且无论如何都不想在列表中重复,则最有效的方法是停止使用列表,而使用 set -of-strings (又名SS)类型。要将项目添加到集合中(无重复项),只需使用“ ADD #items:item”(无需任何其他条件-不会添加重复项)。