Search code examples
amazon-dynamodbdynamodb-queries

Why does Dynamo DB throw an error when updating a map key with the same value?


I am trying to run a simple update query, but got an error when I tried to update the key of a map to the same value. Is there a technical reason this would be disallowed? or some kind of best-practice that I am violating by trying to do this?

Error:

ValidationException: Invalid UpdateExpression: Two document paths overlap with each other; 
must remove or rewrite one of these paths; path one: [questions, What is xx?], path two: [questions, What is xx?]

Query object:

{
  TableName: 'notesTable',
  Key: { topic: 'My tooic' },
  ExpressionAttributeNames: { '#qq': 'What is xx?', '#updq': 'What is xx?' },
  ExpressionAttributeValues: { ':updans': 'new answer' },
  UpdateExpression: 'REMOVE questions.#qq SET questions.#updq = :updans'
}

Solution

  • Multiple ways to deal with scenario when same key needs to be updated. Instead of removing and updating the same key, we can simply SET the key , which replaced the value anyhow.

    So, simple way is to send different updateExpression each time.

    const qq = "What is xx2?";
    const updq = "What is xx?";
    let expressionAttributeNames;
    let UpdateExpression;
    
    if (qq === updq) {
      expressionAttributeNames = { "#updq": "What is xx?" };
      UpdateExpression = "SET questions.#updq = :updans";
    } else {
      expressionAttributeNames = { "#qq": "What is xx1?", "#updq": "What is xx?" };
      UpdateExpression = "REMOVE questions.#qq SET questions.#updq = :updans";
    }
    
    docClient.update(
      {
        TableName: "test",
        Key: {
          id: "My tooic",
        },
        ExpressionAttributeNames: expressionAttributeNames,
        ExpressionAttributeValues: { ":updans": "new answer1" },
        UpdateExpression: UpdateExpression,
      },
      function (error, result) {
        console.log("error", error, "result", result);
      }
    );