[英]Updating certain attributes of an object in Dynamo
我有一个 DynamoDB 表Policies
,表内的 object 是pages
。 pages
架构如下所示 -
{
"pages": {
"default": [
{
"label": "Blocked",
"bodyMessage": "This content is restricted by your organisation.",
"pageId": "defaultblocked",
"pageTitle": "Content Blocked",
"url": "some.s3.url"
},
{
"label": "Warning",
"bodyMessage": "This content is not suitable.",
"pageId": "defaultwarning",
"pageTitle": "Not Recommended",
"url": "some.s3.url"
},
{
"label": "Security Risk",
"bodyMessage": "This content is risky.",
"pageId": "defaultsecurityrisk",
"pageTitle": "Risky Content",
"url": "some.s3.url"
},
{
"label": "Cloud Application",
"bodyMessage": "This content is risky.",
"pageId": "defaultcloudapplication",
"pageTitle": "Cloud Application",
"url": "some.s3.url"
}
]
}
}
我想更新pageTitle
的每个 object 的pages.default
和bodyMessage
,但是每个 object 的值会彼此不同。
例如,将pageId
设置为 defaultblocked 的defaultblocked
将具有以下值 -
{
"defaultblocked":{
"pageTitle":"Some title",
"bodyMessage":"Some message"
}
}
因此,基于pageID
,应该选择 pages.default 中的pages.default
并且应该更新属性pageTitle
和bodyMessage
。
这就是整个 object 的样子——
{
"defaultblocked":{
"pageTitle":"Some title",
"bodyMessage":"Some message"
},
"defaultsecurityrisk":{
"pageTitle":"Some title",
"bodyMessage":"Some message"
},
"defaultwarning":{
"pageTitle":"Some title",
"bodyMessage":"Some message"
},
"defaultsecurityrisk":{
"pageTitle":"Some title",
"bodyMessage":"Some message"
},
"defaultcloudapplication":{
"pageTitle":"Some title",
"bodyMessage":"Some message"
}
}
可以使用update_item
方法更新项目中的特定(嵌套)属性,特别是使用如下所示的 UpdateExpression:
SET parent.child =:val
可以以相同的方式连接多个更新属性。
关于如何在两个页面上设置标题/消息的示例如下所示:
table.update_item(
Key={"..": ".."},
ExpressionAttributeNames={
"#p": "pages",
"#blocked": "defaultblocked",
"#sec": "defaultsecurityrisk",
"#title": "pageTitle",},
ExpressionAttributeValues={
":val1": "title of blocked page",
":val2": "message on blocked page",
":val3": "title of security page",
":val4": "message on security page",
},
UpdateExpression="SET #p.#blocked.#title = :val1, #p.#blocked.#msg = :val2, #p.#sec.#title = :val3, #p.#sec.#msg = :val4",
ReturnValues="UPDATED_NEW",
)
注意ExpressionAttributeNames
和ExpressionAttributeValues
。 名称始终必须以#
开头,值始终以:
开头。 这是一个 DynamoDB 约定,用于简化 UpdateExpression,使其更易于阅读并不易出错。
扩展它以包含所有页面应该很简单,只需将页面添加到 UpdateExpression 并将值包含在 ExpressionAttributeNames/Values 中。
编辑:
这种方法的一个警告是,您只能更新已经存在的 map 的项目。 对于您的情况,如果现有项目还没有特定页面,则无法像这样更新。
要在 object 中添加新页面,您必须将整个 object 指定为值:
table.update_item(
Key={...},
ExpressionAttributeNames={
"#p": "pages",
"#blocked": "defaultblocked",
"#sec": "defaultsecurityrisk",
"#title": "pageTitle",
"#msg": "bodyMessage",
"#new": "newpage"
},
ExpressionAttributeValues={
":val1": "title of blocked page",
":val2": "message on blocked page",
":val3": "title of security page",
":val4": "message on security page",
":new": {"pageTitle": "new title", "bodyMessage": "page of new body"}
},
UpdateExpression="SET #p.#new = :new, #p.#blocked.#title = :val1, #p.#blocked.#msg = :val2, #p.#sec.#title = :val3, #p.#sec.#msg = :val4",
ReturnValues="UPDATED_NEW",
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.