Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

Expected

ExpectedUpdateItem 操作的条件块。Expected 是属性/条件对的映射。映射的每个元素均包含一个属性名称、一个比较运算符以及一个或多个值。DynamoDB 将使用比较运算符来比较该属性与您提供的值。对于每个 Expected 元素,计算结果为 true 或 false。

如果您在 Expected 映射中指定多个元素,则默认情况下所有条件的计算结果都必须为 true。换言之,条件将通过 AND 连接在一起。 (您可使用 ConditionalOperator 参数,改为对条件使用 OR。如果这样做,则至少一个条件而不是所有条件的计算结果必须为 true。)

如果 Expected 映射的计算结果为 true,则条件运算将成功;否则将失败。

Expected 包含下列内容:

  • AttributeValueList - 要针对提供的属性计算的一个或多个值。列表中的值数量取决于使用的 ComparisonOperator

    对于 Number 类型,值比较为数字。

    大于、等于或小于的字符串值比较基于带 UTF-8 二进制编码的 Unicode。例如,a 大于 A,而 a 大于 B

    对于 Binary 类型,DynamoDB 在比较二进制值时会将二进制数据的每个字节视为无符号。

  • ComparisonOperator - 用于计算 AttributeValueList 中的属性的运算符。执行比较时,DynamoDB 将使用高度一致的读取。

    下列比较运算符可用:

    EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN | BETWEEN

    以下是每个比较运算符的描述。

    • EQ:等于。EQ 受所有数据类型 (包括列表和映射) 的支持。

      AttributeValueList 只能包含一个 String、Number、Binary、String Set、Number Set 或 Binary Set 类型的 AttributeValue 元素。如果项目包含的 AttributeValue 元素的类型不同于请求中提供的类型,则值不匹配。例如,{"S":"6"} 不等于 {"N":"6"}。此外,{"N":"6"} 不等于 {"NS":["6", "2", "1"]}

    • NE:不等于。NE 受所有数据类型 (包括列表和映射) 的支持。

      AttributeValueList 只能包含一个 String、Number、Binary、String Set、Number Set 或 Binary Set 类型的 AttributeValue。如果项目包含的 AttributeValue 的类型不同于请求中提供的类型,则值不匹配。例如,{"S":"6"} 不等于 {"N":"6"}。此外,{"N":"6"} 不等于 {"NS":["6", "2", "1"]}

    • LE:小于或等于。

      AttributeValueList 只能包含一个 String、Number 或 Binary 类型 (不是组类型) 的 AttributeValue 元素。如果项目包含的 AttributeValue 元素的类型不同于请求中提供的类型,则值不匹配。例如,{"S":"6"} 不等于 {"N":"6"}。此外,{"N":"6"} 不能与 {"NS":["6", "2", "1"]} 进行比较。

    • LT:小于。

      AttributeValueList 只能包含一个 String、Number 或 Binary 类型 (不是组类型) 的 AttributeValue。如果项目包含的 AttributeValue 元素的类型不同于请求中提供的类型,则值不匹配。例如,{"S":"6"} 不等于 {"N":"6"}。此外,{"N":"6"} 不能与 {"NS":["6", "2", "1"]} 进行比较。

    • GE:大于或等于。

      AttributeValueList 只能包含一个 String、Number 或 Binary 类型 (不是组类型) 的 AttributeValue 元素。如果项目包含的 AttributeValue 元素的类型不同于请求中提供的类型,则值不匹配。例如,{"S":"6"} 不等于 {"N":"6"}。此外,{"N":"6"} 不能与 {"NS":["6", "2", "1"]} 进行比较。

    • GT : 大于。

      AttributeValueList 只能包含一个 String、Number 或 Binary 类型 (不是组类型) 的 AttributeValue 元素。如果项目包含的 AttributeValue 元素的类型不同于请求中提供的类型,则值不匹配。例如,{"S":"6"} 不等于 {"N":"6"}。此外,{"N":"6"} 不能与 {"NS":["6", "2", "1"]} 进行比较。

    • NOT_NULL:属性存在。NOT_NULL 受所有数据类型 (包括列表和映射) 的支持。

      注意

      此运算符测试属性 (而不是其数据类型) 是否存在。如果属性“a”的数据类型为 null,并且您使用 NOT_NULL 计算其值,则结果为布尔值 true。之所以获得此结果,是因为属性“a”存在;其数据类型与 NOT_NULL 比较运算符不相关。

    • NULL:属性不存在。NULL 受所有数据类型 (包括列表和映射) 的支持。

      注意

      此运算符测试属性 (而不是其数据类型) 是否不存在。如果属性“a”的数据类型为 null,并且您使用 NULL 计算其值,则结果为布尔值 false。之所以得到此结果,是因为属性“a”存在;其数据类型与 NULL 比较运算符不相关。

    • CONTAINS:检查集中的子序列或值。

      AttributeValueList 只能包含一个 String、Number 或 Binary 类型 (不是组类型) 的 AttributeValue 元素。如果比较的目标属性是 String 类型,则此运算符将查找匹配的子字符串。如果比较的目标属性是 Binary 类型,则此运算符在目标中查找与输入匹配的子序列。如果比较的目标属性是组 (“SS”、“NS”或“BS”),则当运算符找到与组中的任何成员精确匹配的项时,计算结果为 true。

      CONTAINS 受列表的支持:计算“a CONTAINS b”时,“a”可为列表;但是“b”不能为组、映射或列表。

    • NOT_CONTAINS:检查集中是否缺少某个子序列或缺少某个值。

      AttributeValueList 只能包含一个 String、Number 或 Binary 类型 (不是组类型) 的 AttributeValue 元素。如果比较的目标属性是字符串,则此运算符检查某个子字符串的匹配项是否不存在。如果比较的目标属性是二进制,则此运算符检查目标中是否不存在与输入匹配的子序列。如果比较的目标属性是组 (“SS”、“NS”或“BS”),则当运算符does not找到与组中的任何成员精确匹配的项时,计算结果为 true。

      NOT_CONTAINS 受列表的支持:计算“a NOT CONTAINS b”时,“a”可为列表;但是“b”不能为组、映射或列表。

    • BEGINS_WITH:检查前缀。

      AttributeValueList 只能包含一个 String 或 Binary 类型 (而不是 Number 或组类型) 的 AttributeValue。比较的目标属性必须是 String 或 Binary 类型 (而不是 Number 或组类型)。

    • IN:检查两个组中的匹配元素。

      AttributeValueList 可包含一个或多个 String、Number 或 Binary 类型 (而不是组类型) 的 AttributeValue 元素。这些属性与项目的现有组类型属性进行比较。如果项目属性中存在输入集的任何 元素,则表达式的结果为 true。

    • BETWEEN:大于或等于第一个值并且小于或等于第二个值。

      AttributeValueList 必须包含两个类型 String、Number 或 Binary (而不是组类型) 的 AttributeValue 元素。如果目标值大于或等于第一个元素并且小于或等于第二个元素,则目标属性匹配。如果项目包含的 AttributeValue 元素的类型不同于请求中提供的类型,则值不匹配。例如,{"S":"6"} 不能与 {"N":"6"} 进行比较。此外,{"N":"6"} 不能与 {"NS":["6", "2", "1"]} 进行比较

可使用下列参数来代替 AttributeValueListComparisonOperator

  • Value - DynamoDB 要将属性与之比较的值。

  • Exists - 促使 DynamoDB 在尝试条件运算之前计算值的 Boolean 值。

    • 如果 Existstrue,则 DynamoDB 将检查以了解表中是否已存在属性值。如果找到属性值,则条件的计算结果为 true;否则条件的计算结果为 false。

    • 如果 Existsfalse,DynamoDB 将假设表中not存在属性值。如果值实际上不存在,则假设有效,条件的计算结果为 true。如果找到值,则不管有关值不存在的假设,条件的计算结果为 false。

    请注意,Exists 的默认值为 true

ValueExists 参数与 AttributeValueListComparisonOperator 不兼容。请注意,如果您一次性使用两组参数,则 DynamoDB 将返回 ValidationException 异常。

注意

此参数不支持 List 或 Map 类型的属性。

改用 ConditionExpression

假设您要修改 Music 表中的某个项目,但仅当特定条件为 true 时这样做。您可使用带 Expected 参数的 UpdateItem 请求,如此 AWS CLI 示例中所示:

aws dynamodb update-item \ --table-name Music \ --key '{ "Artist": {"S":"No One You Know"}, "SongTitle": {"S":"Call Me Today"} }' \ --attribute-updates '{ "Price": { "Action": "PUT", "Value": {"N":"1.98"} } }' \ --expected '{ "Price": { "ComparisonOperator": "LE", "AttributeValueList": [ {"N":"2.00"} ] } }'

但您可改用 ConditionExpression

aws dynamodb update-item \ --table-name Music \ --key '{ "Artist": {"S":"No One You Know"}, "SongTitle": {"S":"Call Me Today"} }' \ --update-expression 'SET Price = :p1' \ --condition-expression 'Price <= :p2' \ --expression-attribute-values '{ ":p1": {"N":"1.98"}, ":p2": {"N":"2.00"} }'

本页内容: