在DynamoDB中创建嵌套地图

时间:2020-08-24 09:49:44

标签: python amazon-dynamodb boto3

我正在尝试创建一个新地图,并同时为其分配一个新值

这是我要存储在数据库中的数据格式:

{
    "user_id": 1,
    "project_id": 1,
    "MRR": {
         "NICHE": {
             "define your niche": {
                   "vertical": "test",
                   "ideal prospect": "He is the best"
             }
         },
         "Environment": {
             "Trend 1": {
                   "description": "something"
             },
             "Trend 2": {
                   "description": "something else"
             }
         }

    }

}

到目前为止,我用于插入数据的代码是:

def update_dynamo(user_id, project_id, group, sub_type, data):
    dynmoTable.update_item(
        Key = {
            "user_id": user_id
        },
        ConditionExpression=Attr("project_id").eq(project_id),
        UpdateExpression="SET MRR.#group = :group_value",
        ExpressionAttributeNames={
            "#group": group
        },
        ExpressionAttributeValues={
            ":group_value": {}
        }
    )

    dynmoTable.update_item(
        Key={
            "user_id": user_id
        },
        ConditionExpression=Attr("project_id").eq(project_id),
        UpdateExpression="SET MRR.#group.#subgroup = :sub_value",
        ExpressionAttributeNames={
             "#group": group,
             '#subgroup': sub_type
        },
        ExpressionAttributeValues={
             ":sub_value": data
        }
     )
data = {
    "description": "world",
}
if __name__ == "__main__":
    update_dynamo(1, 1, "New Category", "Hello", data)

我的问题是,这2个update_items是否可以合并为一个?

1 个答案:

答案 0 :(得分:1)

当然,您可以将整个嵌套的“文档”分配给顶级属性,而无需只分配标量。

类似的事情应该起作用:

    dynmoTable.update_item(
        Key = {
            "user_id": user_id
        },
        ConditionExpression=Attr("project_id").eq(project_id),
        UpdateExpression="SET MRR.#group = :group_value",
        ExpressionAttributeNames={
            "#group": group
        },
        ExpressionAttributeValues={
            ":group_value": {sub_type: sub_data}
        }
    )

请注意如何将“ group”属性设置为Python字典{subtype: sub_data}。如您所料,boto3会将此字典转换为适当的DynamoDB映射属性。您可以通过一次更新来设置彼此嵌套的复杂嵌套字典,列表。