DynamoDB实现嵌套对象不存在则创建、存在则追加键值对的方法
解决方案
现有代码只完成了Tasks嵌套对象的初始化逻辑,没有补充向Tasks对象写入指定id键值对的操作。DynamoDB的UPDATE操作支持在同一个SET语句内顺序执行多个赋值动作,且if_not_exists初始化后可以直接对嵌套路径赋值,不会出现路径不存在的报错。
修改后的代码如下:
const data = await docClient .update({ TableName: DYNAMO_TABLE, Key: { TaskQueueSid: event.TaskQueueSid, }, UpdateExpression: "SET TaskQueueName = :TaskQueueName, Tasks = if_not_exists(Tasks, :empty_object), Tasks[:id] = :Tasks", ExpressionAttributeValues: { ":TaskQueueName": event.TaskQueueName, ":Tasks": { TaskSid: event.TaskSid, TaskAssignmentStatus: event.TaskAssignmentStatus }, ":id" : id, ":empty_object": {}, }, }) .promise();
逻辑说明
- 同一SET语句内的操作会按逻辑顺序执行,首先判断Tasks是否存在,不存在则初始化为空对象,存在则保留原有数据
- 后续直接对
Tasks[:id]赋值,此时Tasks必然为有效嵌套对象,因此不管是原有Tasks还是刚初始化的空对象,都会正确写入id对应的键值对 - 整个更新操作为原子性,不需要提前读取数据做判断,不会产生并发更新冲突
内容的提问来源于stack exchange,提问作者Chandrahas Balleda
相关产品推荐
相关产品推荐

