Amazon dynamodb 仅当字符串不';DynamoDB表中已存在t
我正在尝试以下代码Amazon dynamodb 仅当字符串不';DynamoDB表中已存在t,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,我正在尝试以下代码 { ExpressionAttributeNames: { "#items": "items" }, ExpressionAttributeValues: { ":item": [slug] }, Key: { listId: listId, userId: userData.userId,
{
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不能为空。正如所解释的那样,contains()
函数只对字符串值(检查子字符串)或set值(检查成员资格)起作用。但是在你的例子中,你没有一个集合,而是一个列表——在DynamoDB中有不同的东西
如果要添加到此列表中的所有项目都是字符串,并且无论如何都不希望列表中出现重复项,那么最有效的方法是停止使用列表,而是使用字符串集(也称为SS)类型。要将项目添加到集合中(没有重复项),只需使用“add#items:item”(无需任何附加条件-不会添加重复项)。如前所述,contains()
函数仅对字符串值(检查子字符串)或集合值(检查成员资格)起作用。但是在你的例子中,你没有一个集合,而是一个列表——在DynamoDB中有不同的东西
如果要添加到此列表中的所有项目都是字符串,并且无论如何都不希望列表中出现重复项,那么最有效的方法是停止使用列表,而是使用字符串集(也称为SS)类型。要将项目添加到集合中(没有重复项),只需使用“添加#项目:项目”(无需任何附加条件-不会添加重复项)。SS不适用于我,因为它不允许空集。SS不适用于我,因为它不允许空集。