仅当DynamoDB表中不存在字符串时才添加到列表

时间:2019-07-14 20:34:30

标签: amazon-dynamodb dynamodb-queries

我正在尝试以下代码

{
        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不能为空。

1 个答案:

答案 0 :(得分:0)

the documentation所述,contains()函数仅适用于字符串值(检查子字符串)或 set 值(检查成员资格)。但是在您的情况下,您没有集合而是一个列表-DynamoDB中有不同的内容。

如果要添加到此列表的所有项目都是字符串,并且无论如何都不想在列表中重复,则最有效的方法是停止使用列表,而使用 set -of-strings (又名SS)类型。要将项目添加到集合中(无重复项),只需使用“ ADD #items:item”(无需任何其他条件-不会添加重复项)。