繁体   English   中英

在 Dynamo 中更新 object 的某些属性

[英]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.defaultbodyMessage ,但是每个 object 的值会彼此不同。

例如,将pageId设置为 defaultblocked 的defaultblocked将具有以下值 -

{
  "defaultblocked":{
    "pageTitle":"Some title",
    "bodyMessage":"Some message"
  }
}

因此,基于pageID ,应该选择 pages.default 中的pages.default并且应该更新属性pageTitlebodyMessage

这就是整个 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",
    )

注意ExpressionAttributeNamesExpressionAttributeValues 名称始终必须以#开头,值始终以:开头。 这是一个 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM