Rishabh Jain
Rishabh Jain

Reputation: 536

append to list if exist or add list in dynamoDB

I have a product table in DynamoDB which has some items. Now I need to add list of buyers to the product which can grow i.e. append to list. It works for if I have an empty list or a list with some items in the table item but for the first addition it throws an error. Is there any way to check if list exists then append else add a list. here is my code

let params = {
    TableName: "product",
    ExpressionAttributeNames: {
        "#Y": "buyer"
    },
    ExpressionAttributeValues: {
        ":y": ["PersonXYZ"]
    },
    Key: {
        id: 'Hy2H4Z-lf'
    },
    UpdateExpression: "SET #Y = list_append(#Y,:y)"
};
updateItemInDDB(params).then((data) => {
    res.status(200).send(data);
}, err => {
    console.log(err);
    res.sendStatus(500);
});

UpdateItemInDDB is just a function which takes a params and run dnamodb code on it. I am using javascript sdk for DynamoDB with Document Client.

Upvotes: 4

Views: 12462

Answers (2)

Nasreen Ustad
Nasreen Ustad

Reputation: 1702

var params = {
            TableName: "user",
            Key: {
                "user_id": {
                    S: user_id
                }
            },
            UpdateExpression: "SET #ri = list_append(if_not_exists(#ri, :empty_list), :vals)",
            ExpressionAttributeNames: {
                "#ri": "images"
            },
            ExpressionAttributeValues: {
                ":vals": {"L": [{
                    "S": "dummy data"
                }]},
                ":empty_list": {"L": []}
            },
            ReturnValues: 'ALL_NEW'
        };

":empty_list": {"L": []} this is important if you want to set empty list, otherwise it will give below exception.

"errorMessage": "ExpressionAttributeValues contains invalid value: Supplied AttributeValue is empty, must contain exactly one of the supported datatypes for key :empty_list",
  "errorType": "ValidationException"

Upvotes: 26

F_SO_K
F_SO_K

Reputation: 14819

EDIT: Nest the conditional expressions

You could run SET append_list with a ConditionalExpression that the attribute does exist, then if that fails run SET with a ConditinalExpression that the attribute does not exist.

let params1 = {
    TableName: "product",
    ExpressionAttributeNames: {
        "#Y": "buyer"
    },
    ExpressionAttributeValues: {
        ":y": ["PersonXYZ"]
    },
    Key: {
        id: 'Hy2H4Z-lf'
    },
    ConditionExpression: "attribute_exists(buyer)",
    UpdateExpression: "SET #Y = list_append(#Y,:y)"
};
updateItemInDDB(params1).then((data) => {
    res.status(200).send(data);
}, err => {
    console.log(err);
    let params2 = {
    TableName: "product",
    ExpressionAttributeNames: {
        "#Y": "buyer"
    },
    ExpressionAttributeValues: {
        ":y": ["PersonXYZ"]
    },
    Key: {
        id: 'Hy2H4Z-lf'
    },
    ConditionExpression: "attribute_not_exists(buyer)",
    UpdateExpression: "SET #Y = (#Y,:y)"
    };
    updateItemInDDB(params2).then((data) => {
    res.status(200).send(data);
    }, err => {
        console.log(err);
        res.sendStatus(500);
    });
});

Upvotes: 2

Related Questions