

# KeyConditions（遗留）
<a name="LegacyConditionalParameters.KeyConditions"></a>

**注意**  
我们建议您尽可能使用新的表达式参数，而不是这些旧式参数。有关更多信息，请参阅 [在 DynamoDB 中使用表达式](Expressions.md)。有关取代此参数的新参数的具体信息，请参阅[改用 *KeyConditionExpression*。](#KeyConditionExpression.instead)。

遗留条件参数 `KeyConditions` 包含 `Query` 操作的选择标准。对于表的查询，只能对表主键属性设置条件。必须提供分区键名称和值作为 `EQ` 条件。可以选择提供排序键作为另一个条件。

**注意**  
如果不提供排序键条件，则将检索与分区键匹配的所有项目。如果存在 `FilterExpression` 或 `QueryFilter`，将在检索项目后应用。

对于索引查询，只能对索引键属性设置条件。必须提供索引键名称和值作为 `EQ` 条件。可以选择提供索引排序键作为另一个条件。

每个 `KeyConditions` 元素包含要比较的属性名称以及以下内容：
+  `AttributeValueList` - 对提供的属性计算的一个或多个值。列表中的值取决于使用的 `ComparisonOperator`。

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

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

  对于 Binary，DynamoDB 比较二进制值时将二进制数据的每个字节视为无符号。
+  `ComparisonOperator` - 用于计算属性的比较运算符。例如：等于、大于、小于等。

  对于 `KeyConditions`，支持下列比较运算符：

   `EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN` 

  下面介绍每个比较运算符。
  +  `EQ`：等于。

     `AttributeValueList` 只能包含一个 String、Number 或 Binary（不是集合类型）的 `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"]}`。
  +  `BEGINS_WITH`：检查前缀。

     `AttributeValueList` 只能包含一个 String 或 Binary（不是 Number 或集合类型）的 `AttributeValue`。比较的目标属性必须是 String 或 Binary 类型（不是 Number 或集合类型）。
  +  `BETWEEN`：大于或等于第一个值，小于或等于第二个值。

     `AttributeValueList` 必须包含两个相同类型的 `AttributeValue` 元素，可以是 String、Number 或 Binary（不是集合类型）。如果目标值大于等于第一个元素，小于等于第二个元素，则目标属性匹配。如果项目包含的 `AttributeValue` 元素类型与请求提供的类型不同，则值不匹配。例如，`{"S":"6"}` 不等于 `{"N":"6"}`。`{"N":"6"}` 不等于 `{"NS":["6", "2", "1"]}`。

## 改用 *KeyConditionExpression*– 示例
<a name="KeyConditionExpression.instead"></a>

假设要用相同分区键从 *Music* 表检索多个项目。可以使用 `Query` 请求和 `KeyConditions` 参数，如这个 AWS CLI 示例：

```
aws dynamodb query \
    --table-name Music \
    --key-conditions '{
        "Artist":{
            "ComparisonOperator":"EQ",
            "AttributeValueList": [ {"S": "No One You Know"} ]
        },
        "SongTitle":{
            "ComparisonOperator":"BETWEEN",
            "AttributeValueList": [ {"S": "A"}, {"S": "M"} ]
        }
    }'
```

您可以改用 `KeyConditionExpression`：

```
aws dynamodb query \
    --table-name Music \
    --key-condition-expression 'Artist = :a AND SongTitle BETWEEN :t1 AND :t2' \
    --expression-attribute-values '{
        ":a": {"S": "No One You Know"}, 
        ":t1": {"S": "A"}, 
        ":t2": {"S": "M"}
    }'
```