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

Som*_*ter 3 search conditional amazon-web-services 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
Run Code Online (Sandbox Code Playgroud)

expression.json - 在 contains 中使用的变量

{
    ":file_name": {
        "S": "20200322"
    }
}
Run Code Online (Sandbox Code Playgroud)

key.json - 我不明白这个文件的意义

{
    "file_name": {
        "S": "20200322"
    }
}
Run Code Online (Sandbox Code Playgroud)

错误

参数验证失败:参数 ExpressionAttributeNames 的类型无效。:file_name,值:OrderedDict([(u'S', u'202​​00322')]),类型:,有效类型:

问题

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

参考

Fré*_*nri 8

contains函数有 2 个参数:apathoperand

包含(路径,操作数)

在这里,您缺少操作数。

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
Run Code Online (Sandbox Code Playgroud)

请注意,一对单引号中有双引号。

在 JSON 中应该是这样的

{
    ":file_name": {
        "S": "20200322"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

让我们假设你有

{
    "Id": {
        "N": "12345"
    }
    "file_name": {
        "S": "20200322"
    }
}
Run Code Online (Sandbox Code Playgroud)

运行命令

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
Run Code Online (Sandbox Code Playgroud)

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

{
    ":file_name": {
        "S": "20200322"
    }
}
Run Code Online (Sandbox Code Playgroud)

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