使用表达式和条件 - Amazon SDK for Java 2.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用表达式和条件

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 通常需要表达式值映射。映射提供了字符串表达式中占位符的值。映射键由前面带有冒号 (:) 的占位符名称组成,映射值是 AttributeValue 的实例。AttributeValues 类具有从文字生成 AttributeValue 实例的便捷方法。或者,您可以使用 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() 方法时,条件表示为 QueryConditionalQueryConditional 类有几种静态便利方法,可帮助您编写用于确定要从 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 中更新项目的标准方法。但是,当您需要更多功能时,UpdateExpressions 会提供 DynamoDB 更新表达式语法的类型安全表示形式。例如,您可以使用 UpdateExpressions 增加值而不必先读取 DynamoDB 中的项目,或者将单个成员添加到列表中。更新表达式目前在 updateItem() 方法的自定义扩展中可用。

有关使用更新表达式的示例,请参阅本指南中的自定义扩展示例

有关更新表达式的更多信息,请参阅《Amazon DynamoDB 开发人员指南》。