本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用表达式和条件
DynamoDB 增强型客户端 API 中的表达式是 DynamoDB 表达式的 Java 表示形式。
DynamoDB 增强型客户端 API 使用三种类型的表达式:
- Expression
-
Expression
类在定义条件和筛选条件时使用。 QueryConditional
-
这种类型的表达式表示查询操作的关键条件。
UpdateExpression
-
该类可帮助您编写 DynamoDB 更新表达式,当您更新项目时,目前会在扩展框架中使用该类。
表达式刨析
表达式由以下内容组成:
-
字符串表达式(必需)。该字符串包含一个 DynamoDB 逻辑表达式,其中包含属性名称和属性值的占位符名称。
-
表达式值映射(通常是必需的)。
-
表达式名称映射(可选)。
使用生成器生成一个采用以下一般形式的 Expression
对象。
Expression expression = Expression.builder() .expression(
<String>
) .expressionNames(<Map>
) .expressionValues(<Map>
) .build()
Expression
通常需要表达式值映射。映射提供了字符串表达式中占位符的值。映射键由前面带有冒号 (:
) 的占位符名称组成,映射值是 AttributeValueAttributeValue
实例的便捷方法。或者,您可以使用 AttributeValue.Builder
生成 AttributeValue
实例。
以下代码段展示了在注释行 2 之后有两个条目的映射。传递给 expression()
方法的字符串(显示在注释行 1 之后)包含 DynamoDB 在执行操作之前解析的占位符。此代码段不包含表达式名称映射,因为 price 是允许的属性名称。
public static void scanAsync(DynamoDbAsyncTable productCatalog) { ScanEnhancedRequest request = ScanEnhancedRequest.builder() .consistentRead(true) .attributesToProject("id", "title", "authors", "price") .filterExpression(Expression.builder() // 1. :min_value and :max_value are placeholders for the values provided by the map .expression("price >= :min_value AND price <= :max_value") // 2. Two values are needed for the expression and each is supplied as a map entry. .expressionValues( Map.of( ":min_value", numberValue(8.00), ":max_value", numberValue(400_000.00))) .build()) .build();
如果 DynamoDB 表中的属性名称是保留字、以数字开头或包含空格,则 Expression
需要表达式名称映射。
例如,如果属性名称是 1price
,而不是前面的代码示例中的 price
,则需要修改示例,如以下示例所示。
ScanEnhancedRequest request = ScanEnhancedRequest.builder() .filterExpression(Expression.builder() .expression("#price >= :min_value AND #price <= :max_value") .expressionNames( Map.of("#price", "1price") ) .expressionValues( Map.of(":min_value", numberValue(8.00), ":max_value", numberValue(400_000.00))) .build()) .build();
表达式名称的占位符以井号 (#
) 开头。表达式名称映射的条目使用占位符作为键,使用属性名称作为值。使用 expressionNames()
方法将映射添加到表达式生成器中。DynamoDB 会在执行操作之前解析属性名称。
如果在字符串表达式中使用函数,则不需要表达式值。表达式函数的一个例子是 attribute_exists(
。<attribute_name>
)
以下示例构建了一个使用 DynamoDB 函数的 Expression
。本示例中的表达式字符串不使用占位符。此表达式可用于 putItem
操作以检查数据库中是否已存在 movie
属性值等于数据对象的 movie
属性的项目。
Expression exp = Expression.builder().expression("attribute_not_exists (movie)").build();
《DynamoDB 开发人员指南》包含有关可用于 DynamoDB 的低级别表达式的完整信息。
条件表达式和条件语句
使用 putItem()
、updateItem()
和 deleteItem()
方法时,以及使用事务和批处理操作时,您可以使用 Expression
对象来指定 DynamoDB 必须满足什么条件才能继续执行操作。这些表达式是命名条件表达式。有关示例,请参阅本指南中显示的事务示例的 addDeleteItem()
方法中使用的条件表达式(在注释行 1 之后)。
使用 query()
方法时,条件表示为 QueryConditional
QueryConditional
类有几种静态便利方法,可帮助您编写用于确定要从 DynamoDB 读取哪些项目的标准。
有关 QueryConditionals
的示例,请参阅本指南Query 方法示例部分的第一个代码示例。
筛选条件表达式
筛选表达式用于扫描和查询操作以筛选返回的项目。
从数据库中读取所有数据后,会应用筛选表达式,因此读取成本与不使用筛选条件时的读取成本相同。《Amazon DynamoDB 开发人员指南》提供了有关使用筛选表达式进行查询和扫描操作的更多信息。
以下示例展示了添加到扫描请求的筛选表达式。该标准将返回的项目限制为价格介于 8.00 到 80.00(含)之间的项目。
Map<String, AttributeValue> expressionValues = Map.of( ":min_value", numberValue(8.00), ":max_value", numberValue(80.00)); ScanEnhancedRequest request = ScanEnhancedRequest.builder() .consistentRead(true) // 1. the 'attributesToProject()' method allows you to specify which values you want returned. .attributesToProject("id", "title", "authors", "price") // 2. Filter expression limits the items returned that match the provided criteria. .filterExpression(Expression.builder() .expression("price >= :min_value AND price <= :max_value") .expressionValues(expressionValues) .build()) .build();
更新表达式
DynamoDB 增强型客户端的 updateItem()
方法提供了一种在 DynamoDB 中更新项目的标准方法。但是,当您需要更多功能时,UpdateExpressionsUpdateExpressions
增加值而不必先读取 DynamoDB 中的项目,或者将单个成员添加到列表中。更新表达式目前在 updateItem()
方法的自定义扩展中可用。
有关使用更新表达式的示例,请参阅本指南中的自定义扩展示例。
有关更新表达式的更多信息,请参阅《Amazon DynamoDB 开发人员指南》。