I am new to Dynamo and I created a simple todo API with Serverless Framework and TypeScript
To update an Item I have to do this huge params
const
const params = {
TableName: process.env.DYNAMO_TABLE_TODO,
Key: {
id: event.pathParameters.id,
},
ExpressionAttributeNames: {
"#todo_text": "text",
},
ExpressionAttributeValues: {
":text": data.text,
":checked": data.checked,
":updatedAt": timestamp,
},
UpdateExpression: "SET #todo_text = :text, checked = :checked, updatedAt = :updatedAt",
ReturnValues: "ALL_NEW",
}
// update the todo in the database
dynamoDb.update(params, (error, result) => {
if (error) throw error
callback(null, {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify(result.Attributes),
})
})
Is there a more cleaner way to do this? With Mongoose I will simply do
Model.findOneAndUpdate({{ _id: id }, {
text: data.text,
checked: data.checked,
updatedAt: timestamp
})
It's not only about code being ugly or not, if I want a property A2 be written to the database only if A1 is present in Mongoose I can just remove that property from the second object, while in Dynamo I would have to write a different ExpressionAttributeValues
and UpdateExpression
adding more probabilities of me or other dev making an error
Since you are referring to Mongoose which is an abstraction, it's only fair to answer the question by providing a similar abstraction.
There's a modelling tool inspired by mongoose which should provide what you're asking for. https://github.com/dynamoose/dynamoose
This will allow you to do stuff like this:
await User.update({"id": 1, "name": "Bob"}); // This code will set `name` to Bob for the user where `id` = 1
from https://dynamoosejs.com/guide/Model#modelupdatekey-updateobj-settings-callback