-1

I am creating an app using a GraphQL API in AWS AppSync, with DynamoDB for storage. My DynamoDB table utilises a primary key only (id) and does not use a sort key. I want to ensure that new objects added to the table (with the same primary key / id) do not overwrite existing objects.

My lambda function handler contains the following code:

const params = {
        TableName : "myTable",
        Item: {
            id: "4321",
            name: event.arguments.input.name,
            description: event.arguments.input.description
        },
        ConditionalExpression: 'attribute_not_exists(id)',
    };

await documentClient.put(params, function(err, data) {
        if (err) {
            console.log(err);
            callback(err);
        } else {
            callback(null, data)
        }
    }).promise();

According to multiple sources (1, 2, 3), the conditional expression attribute_not_exists(id) should prevent entries with the same id being added to the table, since this is the primary key and I do not have a sort key.

After adding the first object to the database, I expected that subsequent calls would fail, since I hardcoded the id field to check that objects cannot be overwritten with the same ID. However, I can see that the object is being updated in DynamoDB, as the non-key fields (name and description) are changing.

For additional context, I have been executing this mutation using the 'Run a Query' part of the AppSync console in the AWS management console. Then I check to see if the mutation is successful by looking at my DynamoDB tables in the AWS management console.

Moo
  • 39
  • 5

1 Answers1

1

Found that this was due to a spelling error - 'ConditionalExpression' should be 'ConditionExpression'.

Moo
  • 39
  • 5