13

I want to create a new map if it doesn't exist and then add an attribute to that map. Something like this:

SET #A = if_not_exists(#A, :emptyMap), #A.#B = :somevalue

However doing the above gives me the error saying Two document paths overlap with each other

The only other thing I am thinking to do is do TWO updates, one to create any empty maps and then another to set attributes.

Is there a way to do it in a single update ?

Update

Another use case is creating maps that contain other maps. Currently the only way I can think of to create the following is 3 separate update calls to create the maps if necessary and then another update call to add attributes:

{
  Entities: { A: { B: {} } },
}

There must be a better way.

0

1 Answer 1

9

You can amortize the cost of doing two seperate UpdateItem calls, one to create #A, and the other to add #B to #A by adding #B to #A with a conditional update.

UpdateExpression: SET #A.#B = :valueOfB
ConditionExpression: attribute_exists(#A)

If you add many entries to #A, then you only create #A once, and as the number of entries in #A increases, the amortized time to create #A approaches zero. If you catch a ConditionalCheckFailedException, that is when you would create the map with #B already in it and call UpdateItem:

UpdateExpression: SET #A = :valueOfMapWithBInIt
ConditionExpression: attribute_not_exists(#A)
Sign up to request clarification or add additional context in comments.

2 Comments

Hi, I have exactly the same problem. In this solution what if another thread attempt to update this attribute before the first thread execute the second update? As they are two different updates do we need to have some locking? Thanks
Unfortunately, you cannot use this approach in a transaction as "Transaction request cannot include multiple operations on one item"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.