Created
January 22, 2022 04:40
-
-
Save crsepulv/4b4a44ccbd165b0abc2b91f76117baa5 to your computer and use it in GitHub Desktop.
Update Nested Object on DynamoDB using Javascript/Typescript node.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Recursive function to get UpdateExpression,ExpressionAttributeValues & ExpressionAttributeNames to update a nested object on dynamoDB | |
* All levels of the nested object must exist previously on dynamoDB, this only update the value, does not create the branch. | |
* Only works with objects of objects, not tested with Arrays. | |
* @param obj , the object to update. | |
* @param k , the seed is any value, takes sense on the last iteration. | |
*/ | |
function getDynamoExpression(obj, k) { | |
const key = Object.keys(obj); | |
let UpdateExpression = 'SET '; | |
let ExpressionAttributeValues = {}; | |
let ExpressionAttributeNames = {}; | |
let response = { | |
UpdateExpression: ' ', | |
ExpressionAttributeNames: {}, | |
ExpressionAttributeValues: {} | |
}; | |
//https://stackoverflow.com/a/16608074/1210463 | |
/** | |
* true when input is object, this means on all levels except the last one. | |
*/ | |
if (((!!obj) && (obj.constructor === Object))) { | |
response = getDynamoExpression(obj[key[0]], key); | |
UpdateExpression = 'SET #' + key + '.' + response['UpdateExpression'].substring(4); //substring deletes 'SET ' for the mid level values. | |
ExpressionAttributeNames = {['#' + key]: key.toString(), ...response['ExpressionAttributeNames']}; | |
ExpressionAttributeValues = response['ExpressionAttributeValues']; | |
} else { | |
UpdateExpression = 'SET = :' + k; | |
ExpressionAttributeValues = { | |
[':' + k]: obj | |
} | |
} | |
//removes trailing dot on the last level | |
if (UpdateExpression.indexOf(". ")) { | |
UpdateExpression = UpdateExpression.replace(". ", ""); | |
} | |
return {UpdateExpression, ExpressionAttributeValues, ExpressionAttributeNames}; | |
} | |
//you can try many levels. | |
const obj = { | |
level1: { | |
level2: { | |
level3: { | |
level4: 'value' | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment