Expected - Amazon DynamoDB
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Expected

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

如果您在 Expected 映射中指定多个元素,则默认情况下,所有条件的计算结果都必须为 true。换句话说,条件是 ANDed 在一起的。(您可以使用 ConditionalOperator 参数来 OR 条件。 如果您执行此操作,则至少有一个条件的计算结果必须为 true,而不是所有条件。)

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

Expected 包含以下内容:

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

    对于类型数字,值比较是数字比较。

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

    对于二进制类型,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,则运算符检查子字符串匹配。如果比较的目标属性类型为“二进制”,则运算符将查找与输入匹配的目标的子序列。如果比较的目标属性是集合(“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 的 AttributeValue (不是数字或集合类型)。比较的目标属性必须是字符串或二进制类型 (不是数字或集合类型)。

    • IN:检查两个集合中是否有匹配的元素。

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

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

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

可以使用以下参数代替 AttributeValueListComparisonOperator

  • Value - 供 DynamoDB 与属性进行比较的值。

  • Exists - 一个布尔值,该值导致 DynamoDB 在尝试条件操作之前评估该值:

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

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

    请注意,Exists 的默认值为 true

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

注意

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

改用 ConditionExpression

假设您要修改 Music 表中的项目,但条件仅为 true。您可以将 UpdateItem 请求与 Expected 参数结合使用,如以下 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"} }'