Mohammed Rashid
Mohammed Rashid

Reputation: 65

Insert into existing map a map structure in DynamoDB using Nodejs

Structure of an item in database is as shown below:

{
    "cars": {
        "x": [
            {
                "time": 1485700907669,
                "value": 23
            }
        ]
    },
    "date": 1483214400000,
    "id":"1"
}

I have to add a new item "z" of type list to cars like

{
    "cars": {
        "x": [
            {
                "time": 1485700907669,
                "value": 23
            }
        ],
        "z": [
            {
                "time": 1485700907669,
                "value": 23
            }
        ]
    },
    "date": 1483214400000,
    "id": "1"
}

What would the update expression in Node.js look like if I want to achieve somethings like this? So far this is what I came up with: set #car.#model= list_append(if_not_exists(#car.#model, :empty_list), :value)

However, if the item does not exist at the time of creation it throws error. Any idea how to do this?

This is the updated parameter I am using, still doesn't work

  var params = {
  TableName:table,
  Key:{
      "id": id,
      "date": time.getTime()
  },
  ReturnValues: 'ALL_NEW',
  UpdateExpression: 'SET #car.#model = if_not_exists(#car.#model,     
  :empty_list)',
  ExpressionAttributeNames: {
    '#car': 'cars',
    '#model':"z"
  },
  ExpressionAttributeValues: {
    ':empty_list': [],
  }
 };

Upvotes: 1

Views: 2702

Answers (2)

Mohammed Rashid
Mohammed Rashid

Reputation: 65

The solution is to update operation in two steps, first create a empty map for the parent since it does not exist in the first place. So, in my case

SET #car= :empty_map

where :empty_map = {}

after doing this run the other update expression

SET #car.#model = list_append(if_not_exists(#car.#model, :empty_list), :value)

where :empty_list=[] and :value= { "time": 1485700907669, "value": 23 }

Upvotes: 1

Khalid T.
Khalid T.

Reputation: 10547

Break your update expression apart into two separate expressions:

SET #car.#model = if_not_exists(#car.#model, :empty_list) SET #car.#model = list_append(#car.#model, :value)

Upvotes: 0

Related Questions