我是AWS DynamoDB的新手,需要专家的指导。
我正在创建一个应用程序,该应用程序将显示事件列表,其中事件日期必须大于今天日期,并按事件日期降序排序。我的表架构如下:
分区键= eventid
排序键= eventdate
如果我使用关系数据库,我可以使用“SELECT * FROM events eventdate> todaydate ORDERBY eventdate DESC”,但我想如何使用AWS DynamoDB实现这一目标?我希望使用QUERY而不是SCAN。
答案 0 :(得分:0)
根据DynamoDB Query API Documentation:
查询:
Query操作使用表的主键或辅助索引 直接访问该表或索引中的项目。
使用 KeyConditionExpression 参数提供特定值 对于分区键。 Query操作将返回所有 具有该分区键值的表或索引中的项。您可以 通过指定a,可以选择缩小Query操作的范围 排序键值和KeyConditionExpression中的比较运算符。 您可以使用ScanIndexForward参数获取结果 或按逆序排序。
KeyConditionExpression :
指定项目的键值的条件 通过Query操作检索。
条件必须对单个分区键执行相等性测试 值。该条件还可以执行几个比较测试之一 在单个排序键值上。查询可以使用KeyConditionExpression来 检索具有给定分区键值的一个项目并对键值进行排序, 或几个具有相同分区键值但不同的项目 排序键值。
需要分区键相等性测试,并且必须在中指定 格式如下:
partitionKeyName = :partitionkeyval
如果您还想为排序键提供条件,则必须是 使用AND与排序键的条件组合。以下是 例如,使用=比较运算符作为排序键:
partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval
排序键条件的有效比较如下:
- ,则为true
sortKeyName = :sortkeyval
- 如果排序键值等于:sortkeyval。- ,则为true
sortKeyName < :sortkeyval
- 如果排序键值小于:sortkeyval。sortKeyName <= :sortkeyval
- 如果排序键值小于或等于,则为true:sortkeyval。- ,则为true
sortKeyName > :sortkeyval
- 如果排序键值大于:sortkeyval。sortKeyName >= :sortkeyval
- 如果排序键值大于或等于:sortkeyval,则为true。sortKeyName BETWEEN :sortkeyval1 AND :sortkeyval2
- 如果排序键值大于或等于:sortkeyval1且小于 或等于:sortkeyval2。begins_with ( sortKeyName, :sortkeyval )
- 如果排序键值以特定操作数开头,则为true。 (你不能使用这个功能 使用Number类型的排序键。)您可以选择使用ExpressionAttributeNames参数 用占位符替换分区键的名称和排序键 令牌。如果属性名称冲突,则可能需要此选项 使用DynamoDB保留字。例如,以下内容 KeyConditionExpression参数导致错误,因为Size是a 保留字:
Size = :myval
要解决此问题,请定义占位符(例如#S)来表示 属性名称大小。 KeyConditionExpression然后如下:
#S = :myval
有关保留字的列表,请参阅亚马逊中的保留字 DynamoDB开发人员指南。
有关ExpressionAttributeNames和的更多信息 ExpressionAttributeValues,请参阅使用占位符作为属性名称 和Amazon DynamoDB开发人员指南中的值。
类型:字符串
必填:否
您的方案可以转换为以下代码:
$tableName = "genericTable";
$response = $dynamodb->query([
'TableName' => $tableName,
'IndexName' => 'OrderCreationDateIndex',
'KeyConditionExpression' => 'partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval',
'ExpressionAttributeValues' => [
':partitionkeyval' => ['S' => 'pkey'],
':sortkeyval' => ['S' => 'sortkey']
],
'Select' => 'ALL_PROJECTED_ATTRIBUTES',
'ScanIndexForward' => false,
'ConsistentRead' => true,
'Limit' => 5,
'ReturnConsumedCapacity' => 'TOTAL'
]);
答案 1 :(得分:-1)
不幸的是,您无法使用Query API实现上述用例。
<强>原因: - 强>
您需要大于比较运算符。可以在FilterExpression
上使用非相等性比较运算符,或使用KeyConditionExpression
在排序键属性上使用。
在上述用例中,您没有eventId
,因此您无法使用
KeyConditionExpression
。即使使用eventDate
作为哈希键创建GSI,也不能对哈希键使用非相等运算符,并且除Sort键之外的任何属性都不能进行排序。因此,您无法使用GSI选项实现排序要求。
针对上述用例使用查询API的变通方法解决方案: -
使用散列密钥eventDate
使用查询API按eventDate
在客户端按eventDate
对数据进行排序。大多数编程语言都有很好的排序API。您可以在客户端轻松实现此目的
注意: - 强>