DynamoDB 中的条件表达式和筛选表达式、运算符及函数 - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

DynamoDB 中的条件表达式和筛选表达式、运算符及函数

要操作 DynamoDB 表中的数据,请使用 PutItemUpdateItemDeleteItem 操作。对于这些数据处理操作,您可指定条件表达式 来确定应修改的项目。如果条件表达式的计算结果为 true,则操作成功。否则,该操作将失败。

本节介绍用于在 Amazon DynamoDB 中编写筛选表达式和条件表达式的内置函数和关键字。有关 DynamoDB 的函数和编程的更多详细信息,请参阅使用 DynamoDB 和 Amazon SDK 编程DynamoDB API 参考

筛选条件和条件表达式的语法

在以下语法摘要中,操作数 可以为下列对象:

  • 顶级属性名称,例如 IdTitleDescriptionProductCategory

  • 引用嵌套属性的文档路径

condition-expression ::= operand comparator operand | operand BETWEEN operand AND operand | operand IN ( operand (',' operand (, ...) )) | function | condition AND condition | condition OR condition | NOT condition | ( condition ) comparator ::= = | <> | < | <= | > | >= function ::= attribute_exists (path) | attribute_not_exists (path) | attribute_type (path, type) | begins_with (path, substr) | contains (path, operand) | size (path)

进行比较

使用以下比较器将操作数与单个值进行比较:

  • a = b – 如果 a 等于 b,则为 True。

  • a <> b – 如果 a 不等于 b,则为 True。

  • a < b – 如果 a 小于 b,则为 True。

  • a <= b – 如果 a 小于等于 b,则为 True。

  • a > b – 如果 a 大于 b,则为 True。

  • a >= b – 如果 a 大于等于 b,则为 True。

使用 BETWEENIN 关键字来将操作数与值范围或值的枚举值列表进行比较:

  • a BETWEEN b AND c – 如果 a 大于或等于 b,且小于或等于 c,则为 True。

  • a IN (b, c, d) – 如果 a 等于列表中的任何值 — 例如 bcd,则为 True。列表最多可以包含 100 个值,以逗号分隔。

函数

使用以下函数确定项目中是否存在某个属性,或者对属性求值。这些函数名称区分大小写。对于嵌套属性,您必须提供其完整文档路径。

函数 描述

attribute_exists (path)

如果项目包含 path 指定的属性,则为 true。

示例:检查 Product 表中的项目是否具有侧视图图片。

  • attribute_exists (#Pictures.#SideView)

attribute_not_exists (path)

如果项目中不存在由 path 指定的属性,则为 true。

示例:检查项目是否具有 Manufacturer 属性。

  • attribute_not_exists (Manufacturer)

attribute_type (path, type)

如果指定路径中的属性为特定数据类型,则为 true。type 参数必须是下列类型之一:

  • S – String

  • SS – String set

  • N – Number

  • NS – Number set

  • B – Binary

  • BS – Binary set

  • BOOL – Boolean

  • NULL – Null

  • L – List

  • M – Map

您必须使用 type 参数的表达式属性值。

示例:检查 QuantityOnHand 属性是否为列表类型。在本示例中,:v_sub 为字符串 L 的占位符。

  • attribute_type (ProductReviews.FiveStar, :v_sub)

您必须使用 type 参数的表达式属性值。

begins_with (path, substr)

如果 path 指定的属性以特定子字符串开头,则为 true。

示例:检查前视图图片 URL 的前几个字符是否为 http://

  • begins_with (Pictures.FrontView, :v_sub)

表达式属性值 :v_subhttp:// 的占位符。

contains (path, operand)

如果 path 指定的属性为以下之一,则为 true:

  • 一个包含特定子字符串的 String

  • 一个包含集中某个特定元素的 Set

  • 一个包含列表中某个特定元素的 List

如果由 path 指定的属性为 String,则 operand 必须为 String。如果指定的属性 path 是一个 Setoperand 必须是集合的元素类型。

路径和操作数必须不同。也就是说,contains (a, a) 返回错误。

示例:检查 Brand 属性是否包含子字符串 Company

  • contains (Brand, :v_sub)

表达式属性值 :v_subCompany 的占位符。

示例:检查产品是否有红色。

  • contains (Color, :v_sub)

表达式属性值 :v_subRed 的占位符。

size (path)

返回一个代表属性大小的数字。以下是与 size 结合使用的有效数据类型。

如果属性类型为 String,则 size 将返回字符串的长度。

示例:检查字符串 Brand 是否少于等于 20 个字符。表达式属性值 :v_sub20 的占位符。

  • size (Brand) <= :v_sub

如果属性类型为 Binary,则 size 将返回属性值中的字节数。

示例:假设 ProductCatalog 项目有一个名为 VideoClip 的二进制属性,该属性包含使用中的产品的简短视频。以下表达式将检查 VideoClip 是否超过 64000 个字节。表达式属性值 :v_sub64000 的占位符。

  • size(VideoClip) > :v_sub

如果属性是一个 Set 数据类型,则 size 将返回集合中的元素数。

示例:检查产品是否有多种颜色。表达式属性值 :v_sub1 的占位符。

  • size (Color) < :v_sub

如果属性类型为 ListMap,则 size 将返回子元素数。

示例:检查 OneStar 评论的数量是否超过了特定阈值。表达式属性值 :v_sub3 的占位符。

  • size(ProductReviews.OneStar) > :v_sub

逻辑评估

使用 ANDORNOT 关键字执行逻辑评估。在以下列表中,ab 代表要评估的条件。

  • a AND b – 如果 ab 均为 true,则为 True。

  • a OR b – 如果 a 和/或 b 为 true,则为 True。

  • NOT a – 如果 a 为 false,则为 True。如果 a 为 true,则为 False。

以下是操作中 AND 的代码示例。

dynamodb-local (*)> select * from exprtest where a > 3 and a < 5;

圆括号

使用圆括号更改逻辑评估的优先顺序。例如,假设条件 ab 为 true,而条件 c 为 false。以下表达式的计算结果为 True:

  • a OR b AND c

但是,如果将一个条件括在圆括号中,则会先对该条件求值。例如,以下表达式的计算结算为 False:

  • (a OR b) AND c

注意

您可以在表达式中嵌套圆括号。最里面的部分最先评估。

以下是逻辑评估中带有括号的代码示例。

dynamodb-local (*)> select * from exprtest where attribute_type(b, string) or ( a = 5 and c = “coffee”);

条件的优先顺序

DynamoDB 使用以下优先顺序规则从左向右评估条件:

  • = <> < <= > >=

  • IN

  • BETWEEN

  • attribute_exists attribute_not_exists begins_with contains

  • 圆括号

  • NOT

  • AND

  • OR