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不适用于我,因为它不允许空集。