我是AWS DynamoDB的新手,需要专家在这里给予指导。
我正在创建一个应用程序,它将显示一个事件列表,并且事件日期必须大于今天的日期,并按照事件日期降序排列。我的表模式如下:
分区键=事件ID
排序键=事件日期
如果我使用关系型数据库,我可以使用“SELECT * FROM events where eventdate > todaydate ORDERBY eventdate DESC”,但我怎样才能在AWS DynamoDB中实现这一点呢?我希望使用QUERY而不是SCAN。
我是AWS DynamoDB的新手,需要专家在这里给予指导。
我正在创建一个应用程序,它将显示一个事件列表,并且事件日期必须大于今天的日期,并按照事件日期降序排列。我的表模式如下:
分区键=事件ID
排序键=事件日期
如果我使用关系型数据库,我可以使用“SELECT * FROM events where eventdate > todaydate ORDERBY eventdate DESC”,但我怎样才能在AWS DynamoDB中实现这一点呢?我希望使用QUERY而不是SCAN。
Query :
A Query operation uses the primary key of a table or a secondary index to directly access items from that table or index.
Use the KeyConditionExpression parameter to provide a specific value for the partition key. The Query operation will return all of the items from the table or index with that partition key value. You can optionally narrow the scope of the Query operation by specifying a sort key value and a comparison operator in KeyConditionExpression. You can use the ScanIndexForward parameter to get results in forward or reverse order, by sort key.
KeyConditionExpression :
The condition that specifies the key value(s) for items to be retrieved by the Query action.
The condition must perform an equality test on a single partition key value. The condition can also perform one of several comparison tests on a single sort key value. Query can use KeyConditionExpression to retrieve one item with a given partition key value and sort key value, or several items that have the same partition key value but different sort key values.
The partition key equality test is required, and must be specified in the following format:
partitionKeyName = :partitionkeyval
If you also want to provide a condition for the sort key, it must be combined using AND with the condition for the sort key. Following is an example, using the = comparison operator for the sort key:
partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval
Valid comparisons for the sort key condition are as follows:
sortKeyName = :sortkeyval
- true if the sort key value is equal to :sortkeyval.sortKeyName < :sortkeyval
- true if the sort key value is less than :sortkeyval.sortKeyName <= :sortkeyval
- true if the sort key value is less than or equal to :sortkeyval.sortKeyName > :sortkeyval
- true if the sort key value is greater than :sortkeyval.sortKeyName >= :sortkeyval
- true if the sort key value is greater than or equal to :sortkeyval.sortKeyName BETWEEN :sortkeyval1 AND :sortkeyval2
- true if the sort key value is greater than or equal to :sortkeyval1, and less than or equal to :sortkeyval2.begins_with ( sortKeyName, :sortkeyval )
- true if the sort key value begins with a particular operand. (You cannot use this function with a sort key that is of type Number.)You can optionally use the ExpressionAttributeNames parameter to replace the names of the partition key and sort key with placeholder tokens. This option might be necessary if an attribute name conflicts with a DynamoDB reserved word. For example, the following KeyConditionExpression parameter causes an error because Size is a reserved word:
Size = :myval
To work around this, define a placeholder (such a #S) to represent the attribute name Size. KeyConditionExpression then is as follows:
#S = :myval
For a list of reserved words, see Reserved Words in the Amazon DynamoDB Developer Guide.
For more information on ExpressionAttributeNames and ExpressionAttributeValues, see Using Placeholders for Attribute Names and Values in the Amazon DynamoDB Developer Guide.
Type: String
Required: No
您的场景可以转换为以下代码:
$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'
]);
很遗憾,您无法使用Query API实现上述用例。
原因:
您需要大于比较运算符。非相等比较运算符可以在FilterExpression
或使用KeyConditionExpression
的排序键属性上使用。
在上述用例中,您没有eventId
,因此无法使用KeyConditionExpression
。即使您使用eventDate
作为哈希键创建了GSI,也无法对哈希键使用非相等运算符,并且除排序键以外的任何属性都不支持排序。因此,您无法使用GSI选项实现排序要求。
使用Query API的解决方法:
创建一个哈希键为 eventDate
的 GSI
使用 Query API 查询索引,通过 eventDate
进行查询
在客户端按照 eventDate
对数据进行排序。大多数编程语言都有良好的排序 API,您可以轻松地在客户端实现此操作
注意: