首页 > 解决方案 > 如果父级可能不存在,如何有条件地更新 DynamoDB 中的嵌套列表

问题描述

我有下表,主键为“客户”,主条目由位置地图和客户在给定地点购买的物品的字符串集组成

{
    "visits": {
        "M": {
            "location-1": {
                "SS": [
                    "item1",
                    "item2",
                ]
            },
            "location-2": {
                "SS": [
                    "items"
                ]
            }
        }
    },
    "customer": {
        "S": "cool-customer-id"
    }
}

任务:我需要插入一个新项目,而不从数据库中读取。

如果客户不存在或地图location-53中不存在,visits我希望它为特定客户创建一个条目,visits.location-53并将其设置为包含一个项目“item4”的集合。

如果确实存在,我想将该项目附加到现有集合中。

以下更新表达式仅适用于已经为相同或不同位置插入的给定客户 (PutItem) 的先前条目。

request := &dynamodb.UpdateItemInput{
    ConditionExpression: aws.String("not contains (#visits.#place, :newItem)"),

    ExpressionAttributeNames: map[string]string{
        "#visits":     "visits",
        "#place":      "location53",
    },

    ExpressionAttributeValues: map[string]dynamotypes.AttributeValue{
    ":newItem": &dynamotypes.AttributeValueMemberSS{Value: []string{"item4"}},
    },

    Key: map[string]dynamotypes.AttributeValue{
        partitionKeyName: &dynamotypes.AttributeValueMemberS{Value: "some-customer-id-here"},
    },

    TableName:                   aws.String("visits"),

    UpdateExpression: aws.String("ADD #visits.#place :newItem"),

}

db.UpdateItem(context.Background(), request) 

如果客户的条目完全为空,它将返回:

ValidationException:更新表达式中提供的文档路径对更新无效

我怎样才能让它始终工作?

标签: amazon-web-servicesgoamazon-dynamodb

解决方案


推荐阅读