如何在DynamoDB中新增或更新嵌套对象,适配属性存在/缺失两种场景
你不需要担心custom属性是否存在的问题:DynamoDB的update_item接口中,UpdateExpression的SET指令天生就支持「属性不存在则新增、存在则覆盖」的语义。你现有的代码本身就可以适配custom存在/不存在的两种场景,前提是domainBypassList和applicationBypassList这两个父级Map属性一定存在(你给出的两个存储示例都满足该前提)。
如果要兼容更极端的场景(比如部分旧条目可能缺失domainBypassList或applicationBypassList父级属性导致路径报错),可以通过if_not_exists函数给父级属性设置默认空Map兜底,修改后的代码如下:
res = self.service_context.policies.update_item( Key={ 'tenantId': self.event["user"]['tenantId'], 'policyName': self.policy_name }, UpdateExpression=""" set domainBypassList = if_not_exists(domainBypassList, :empty_map), domainBypassList.custom=:dbl, applicationBypassList = if_not_exists(applicationBypassList, :empty_map), applicationBypassList.custom=:abl, updatedAt=:uat """, ExpressionAttributeValues={ ':abl': self.payload["applicationBypassList"], ':dbl': self.payload["domainBypassList"], ':uat': datetime.datetime.now().strftime("%Y/%m/%d, %I:%M %p"), ':empty_map': {} }, ReturnValues="UPDATED_NEW" )
补充说明
- 代码中新增的
if_not_exists判断只有当对应父级属性不存在时才会写入空Map,不会覆盖已有的父级属性内容 - 如果你可以确认所有存储条目都必然存在
domainBypassList和applicationBypassList,完全可以继续使用你原来的代码,不需要做任何修改
内容的提问来源于stack exchange,提问作者Jeet Patel
相关产品推荐
相关产品推荐

