在aws-cli中,如何根据条件从DynamoDB中删除项目?

时间:2017-06-26 15:25:54

标签: amazon-web-services search conditional amazon-dynamodb aws-cli

我正在使用AWS CLI并且在根据条件删除行时出现问题

我有一个file_name密钥,我想删除包含“20200322”的所有密钥。

命令

aws dynamodb delete-item \
    --table-name "logs" \
    --condition-expression "contains(file_name, :file_name)" \
    --expression-attribute-names file://expression.json \
    --key file://key.json

expression.json - 包含

中使用的变量
{
    ":file_name": {
        "S": "20200322"
    }
}

key.json - 我不明白这个文件的重点

{
    "file_name": {
        "S": "20200322"
    }
}

错误

  

参数验证失败:参数的类型无效   ExpressionAttributeNames.:file_name,value:OrderedDict([(你'',   u'202​​00322')]),输入:,有效类型:   

问题

  • 如何根据包含条件删除单个条目?
  • 如果我使用--expression-attribute-names开关,为什么键是强制性的?关键需要是什么?
  • --expression-attribute-values--expression-attribute-names
  • 之间的区别

参考

2 个答案:

答案 0 :(得分:2)

contains函数有2个参数:pathoperand

  

包含(路径,操作数)

这里你错过了操作数。

aws dynamodb delete-item \
    --table-name "logs" \
    --key "{"file_name": {"S": "20200322"}}'
    --condition-expression "contains(file_name, :file_name)" \
    --expression-attribute-values file://wvid_logs.json

并且在Json中应该像

{
    ":file_name": {
        "S": "20200322"
    }
}

问题是您要运行条件删除,因此密钥需要是您要删除的项目的关键,并且表达式属性值将是要检查的条件,我不完全确定您可以在密钥本身上运行一个条件。

假设你有

{
    "Id": {
        "N": "12345"
    }
    "file_name": {
        "S": "20200322"
    }
}

运行命令

aws dynamodb delete-item \
    --table-name "logs" \
    --key "{"Id": {"N": "12345"}}'
    --condition-expression "contains(file_name, :file_name)" \
    --expression-attribute-values file://wvid_logs.json

仅当文件中的条件与项目匹配时,该命令才会删除该项目。所以,如果你在文件中

{
    ":file_name": {
        "S": "20200322"
    }
}

它将删除该项目,您的JSon文件中的任何其他值都不会删除该项目。

答案 1 :(得分:0)

我有一个类似的问题,在我的情况下,我发现(很长一段时间后)直接在终端输入时,键属性(和所有地图属性)应该用单引号括起来

aws dynamodb delete-item \
    --table-name "logs" \
    --condition-expression "contains(file_name, :file_name)" \
    --expression-attribute-names file://expression.json \
    --key '{":file_name": {"S": "20200322"}}'