簡體   English   中英

在嵌套的 DynamoDB 字典上動態和有條件地 update_item

[英]Dynamically and conditionally update_item on nested DynamoDB dict

我有一個 DynamoDB 表,其中包含以下格式的項目:

{
  "attributes": {
    "cities": {
      "oakland": {
        "data": "Some stuff."
      }
    },
    "people": {
      "Joe": {
        "data": "Some stuff."
      }
    }
}

我有一個 JSON 文件 (dynamodbupdate.json),其中包含我想添加的新數據。 結構如下所示:

{
  "attributes": {
    "cities": {
      "oakland": {
        "data_point_1": "warm"
      }
    },
    "people": {
      "Joe": {
        "data_point_1": "tall",
        "data_point_1": "smart"
      }
    }
}

我想使用 boto3 庫中的update_item操作更新表,以將新數據添加到我的表中,而不會覆蓋現有數據。 我可以使用單個表項執行此操作,但我正在嘗試找到一種將新數據動態添加到多個項的方法,以便我的新表如下所示:

{
  "attributes": {
    "cities": {
      "oakland": {
        "data": "Some stuff.",
        "data_point_1": "warm"
      }
    },
    "people": {
      "Joe": {
        "data": "Some stuff."
        "data_point_1": "tall",
        "data_point_2": "smart"
      }
    }
}

對單個項目執行此操作的 UpdateExpression 如下所示:

UpdateExpression = 'SET people.Joe.data_point_1 = if_not_exists(people.Joe.data_point_1, tall)'

但是,我很想找到一種方法來遍歷 dynamodbupdate.json 文件的全部內容並為所有數據發出 update_item 命令。

這篇文章非常接近我所需要的,但在我的示例中,我無法理解正確的方法。 謝謝你的幫助!

我能夠(大部分)通過執行以下操作來解決這個問題:

def lambda_handler(event, context):
    configPath = os.environ['LAMBDA_TASK_ROOT'] + "/dynamodbupdate.json"
    configContents = open(configPath).read()
    configJson = json.loads(configContents)
    ld = configJson.get('attributes').get('cities')
    cities_dict = (list(ld))
    for x in cities_dict:
        all_dp = list(ld.get(x))
        for dp in all_dp:
            update_query = 'SET #a.#c.#x.#dp = if_not_exists(#a.#c.#x.#dp, :val)'
            perform_update = table.update_item(
                Key={'primarykey': whateveryourkeyis},
                ExpressionAttributeValues={
                    ':val': ld.get(x).get(dp)
                },
                ExpressionAttributeNames={
                    '#a': 'attributes',
                    '#c': 'cities',
                    '#x': x,
                    '#dp': dp
                },
                UpdateExpression=update_query)

我也可以循環遍歷城市/人員級別並提取該數據。 希望這可以幫助某人!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM